Repository: antgroup/agentUniverse (language: python)

Issue:
merge master



Discussion / hints:

Fix patch:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index ac7f8b7d..ddd624da 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -19,10 +19,23 @@ Deprecated - Soon to be deprecated features.
 Removed - Features removed in this version.
 Fixed - Any bug fixes.
 Security - Patches and security improvements.
+Note - Additional remarks regarding the version.
 
 ***************************************************
 
 # Version Update History
+## [0.0.5] - 2024-05-08
+### Added
+- The LLM component supports streaming calls.
+- The Knowledge component has an added update definition.
+
+### Fixed
+- Fixed potential concurrency safety issues in the peer planner.
+- Fixed the issue in version 0.0.4 of the PyPI package where the packaging method forced users to enter an AK upon startup.
+
+### Note 
+- Some code optimizations and documentation updates.
+
 ## [0.0.4] - 2024-04-26
 ### Added
 - Add version management capability to the prompt.
@@ -32,6 +45,9 @@ Security - Patches and security improvements.
   * Due to compatibility issues of Gunicorn with Windows systems, automatically identify the kernel version to select the web startup method.
   * Specified YAML reading as UTF-8 encoding method.
 
+### Note
+- [2024-05-08] Please be aware that the PyPI package version 0.0.4 includes the sample_standard_app example project by default. This will reference additional components from sample_standard_app at startup and require users to input an AK. If you are not using the corresponding components, you can bypass this restriction by using a mock AK. This issue has been fixed in version 0.0.5.
+
 ## [0.0.3] - 2024-04-19
 ### Init
 - The official release version of AgentUniverse has been initialized. Enjoy using it!
diff --git a/CHANGELOG_zh.md b/CHANGELOG_zh.md
index 7e6f0a74..9c5e3a1c 100644
--- a/CHANGELOG_zh.md
+++ b/CHANGELOG_zh.md
@@ -19,10 +19,23 @@ Deprecated - 即将废弃的功能。
 Removed - 现版本中移除的功能。
 Fixed - 任何错误修复。
 Security - 补丁与安全改进。
+Note - 对于版本的额外说明。
 
 ***************************************************
 
 # 版本更新记录
+## [0.0.5] - 2024-05-08
+### Added
+- LLM组件支持流式调用
+- 知识组件添加update定义
+
+### Fixed
+- 修复peer planner中可能存在的并发安全性隐患
+- 修复0.0.4版本中pypi package打包方式导致启动强制要求用户填写AK问题
+
+### Note 
+- 追加部分代码优化与文档更新
+
 ## [0.0.4] - 2024-04-26
 ### Added
 - 新增prompt版本管理能力
@@ -31,6 +44,8 @@ Security - 补丁与安全改进。
 - Windows版本下的兼容问题修复
   * 由于Gunicore对于windows系统的兼容问题，自动识别内核版本自动选择web启动方式
   * yaml读取指定为utf-8 encode方式
+### Note 
+- [2024-05-08] 注意，0.0.4的pypi package版本中默认包含了sample_standard_app示例工程, 这将会在启动时引用sample_standard_app中的额外组件,并要求用户填写AK, 若您没有使用对应组件可以通过mock ak跳过这一限制, 这已经在0.0.5版本中修复。
 
 ## [0.0.3] - 2024-04-19
 ### Init
diff --git a/agentuniverse/agent/agent.py b/agentuniverse/agent/agent.py
index fdf8bc3d..2504bafb 100644
--- a/agentuniverse/agent/agent.py
+++ b/agentuniverse/agent/agent.py
@@ -7,6 +7,7 @@
 # @FileName: agent.py
 """The definition of agent paradigm."""
 from abc import abstractmethod
+from datetime import datetime
 from typing import Optional
 
 from agentuniverse.agent.agent_model import AgentModel
@@ -104,6 +105,7 @@ def pre_parse_input(self, input_object) -> dict:
         planner_input = dict()
         planner_input['chat_history'] = input_object.get_data('chat_history') or ''
         planner_input['background'] = input_object.get_data('background') or ''
+        planner_input['date'] = datetime.now().strftime('%Y-%m-%d')
 
         self.parse_input(input_object, planner_input)
         return planner_input
diff --git a/agentuniverse/agent/default/executing_agent/__init__.py b/agentuniverse/agent/default/executing_agent/__init__.py
new file mode 100644
index 00000000..786c85af
--- /dev/null
+++ b/agentuniverse/agent/default/executing_agent/__init__.py
@@ -0,0 +1,7 @@
+# !/usr/bin/env python3
+# -*- coding:utf-8 -*-
+
+# @Time    : 2024/5/7 14:34
+# @Author  : wangchongshi
+# @Email   : wangchongshi.wcs@antgroup.com
+# @FileName: __init__.py.py
diff --git a/agentuniverse/agent/plan/planner/executing_planner/default_cn_prompt.yaml b/agentuniverse/agent/default/executing_agent/default_cn_prompt.yaml
similarity index 94%
rename from agentuniverse/agent/plan/planner/executing_planner/default_cn_prompt.yaml
rename to agentuniverse/agent/default/executing_agent/default_cn_prompt.yaml
index 8f3f1c88..8585edb8 100644
--- a/agentuniverse/agent/plan/planner/executing_planner/default_cn_prompt.yaml
+++ b/agentuniverse/agent/default/executing_agent/default_cn_prompt.yaml
@@ -20,6 +20,8 @@ instruction: |
   背景信息是:
   {background}
   
+  今天的日期是: {date}
+  
   开始!
   我的问题是: {input}
   
@@ -28,4 +30,4 @@ instruction: |
   让我们一步一步来。
 metadata:
   type: 'PROMPT'
-  version: 'executing_planner.default_cn'
+  version: 'default_executing_agent.cn'
diff --git a/agentuniverse/agent/plan/planner/executing_planner/default_en_prompt.yaml b/agentuniverse/agent/default/executing_agent/default_en_prompt.yaml
similarity index 95%
rename from agentuniverse/agent/plan/planner/executing_planner/default_en_prompt.yaml
rename to agentuniverse/agent/default/executing_agent/default_en_prompt.yaml
index 6b7f79d0..b2bef7d3 100644
--- a/agentuniverse/agent/plan/planner/executing_planner/default_en_prompt.yaml
+++ b/agentuniverse/agent/default/executing_agent/default_en_prompt.yaml
@@ -20,6 +20,8 @@ instruction: |
   Background Information:
   {background}
   
+  Today's date is: {date}
+
   Let's begin!
   My question is: {input}
   
@@ -28,4 +30,4 @@ instruction: |
   Let's take it step by step.
 metadata:
   type: 'PROMPT'
-  version: 'executing_planner.default_en'
+  version: 'default_executing_agent.en'
diff --git a/agentuniverse/agent/default/executing_agent.py b/agentuniverse/agent/default/executing_agent/executing_agent.py
similarity index 97%
rename from agentuniverse/agent/default/executing_agent.py
rename to agentuniverse/agent/default/executing_agent/executing_agent.py
index 639fb44a..6364beee 100644
--- a/agentuniverse/agent/default/executing_agent.py
+++ b/agentuniverse/agent/default/executing_agent/executing_agent.py
@@ -37,6 +37,7 @@ def parse_input(self, input_object: InputObject, planner_input: dict) -> dict:
         """
         planner_input['input'] = input_object.get_data('input')
         planner_input['framework'] = input_object.get_data('planning_result').get_data('framework')
+        self.agent_model.profile.setdefault('prompt_version', 'default_executing_agent.cn')
         return planner_input
 
     def parse_result(self, planner_result: dict) -> dict:
diff --git a/agentuniverse/agent/default/executing_agent.yaml b/agentuniverse/agent/default/executing_agent/executing_agent.yaml
similarity index 79%
rename from agentuniverse/agent/default/executing_agent.yaml
rename to agentuniverse/agent/default/executing_agent/executing_agent.yaml
index 341c126c..4f7a3cb0 100644
--- a/agentuniverse/agent/default/executing_agent.yaml
+++ b/agentuniverse/agent/default/executing_agent/executing_agent.yaml
@@ -2,7 +2,6 @@ info:
   name: 'ExecutingAgent'
   description: 'executing agent'
 profile:
-  prompt_version:
   llm_model:
     name: 'default_openai_llm'
     model_name: 'gpt-3.5-turbo'
@@ -15,5 +14,5 @@ memory:
 action:
 metadata:
   type: 'AGENT'
-  module: 'agentuniverse.agent.default.executing_agent'
+  module: 'agentuniverse.agent.default.executing_agent.executing_agent'
   class: 'ExecutingAgent'
\ No newline at end of file
diff --git a/agentuniverse/agent/default/expressing_agent/__init__.py b/agentuniverse/agent/default/expressing_agent/__init__.py
new file mode 100644
index 00000000..6ef78edc
--- /dev/null
+++ b/agentuniverse/agent/default/expressing_agent/__init__.py
@@ -0,0 +1,7 @@
+# !/usr/bin/env python3
+# -*- coding:utf-8 -*-
+
+# @Time    : 2024/5/7 14:35
+# @Author  : wangchongshi
+# @Email   : wangchongshi.wcs@antgroup.com
+# @FileName: __init__.py.py
diff --git a/agentuniverse/agent/plan/planner/expressing_planner/default_cn_prompt.yaml b/agentuniverse/agent/default/expressing_agent/default_cn_prompt.yaml
similarity index 95%
rename from agentuniverse/agent/plan/planner/expressing_planner/default_cn_prompt.yaml
rename to agentuniverse/agent/default/expressing_agent/default_cn_prompt.yaml
index 0e649065..c63b758b 100644
--- a/agentuniverse/agent/plan/planner/expressing_planner/default_cn_prompt.yaml
+++ b/agentuniverse/agent/default/expressing_agent/default_cn_prompt.yaml
@@ -15,6 +15,8 @@ instruction: |
   背景信息是:
   {background}
   
+  今天的日期是: {date}
+
   开始!
   必须使用中文回答用户提出的问题。
   需要回答的问题是: {input}
@@ -22,4 +24,4 @@ instruction: |
   请根据规则要求做出回答。
 metadata:
   type: 'PROMPT'
-  version: 'expressing_planner.default_cn'
+  version: 'default_expressing_agent.cn'
diff --git a/agentuniverse/agent/plan/planner/expressing_planner/default_en_prompt.yaml b/agentuniverse/agent/default/expressing_agent/default_en_prompt.yaml
similarity index 96%
rename from agentuniverse/agent/plan/planner/expressing_planner/default_en_prompt.yaml
rename to agentuniverse/agent/default/expressing_agent/default_en_prompt.yaml
index b5967764..0dc75b5d 100644
--- a/agentuniverse/agent/plan/planner/expressing_planner/default_en_prompt.yaml
+++ b/agentuniverse/agent/default/expressing_agent/default_en_prompt.yaml
@@ -15,6 +15,8 @@ instruction: |
   Background information:
   {background}
   
+  Today's date is: {date}
+
   Let's begin!
   You must answer user questions in English.
   The question that needs answering is: {input}
@@ -22,4 +24,4 @@ instruction: |
   Please provide your response according to to these rules.
 metadata:
   type: 'PROMPT'
-  version: 'expressing_planner.default_en'
+  version: 'default_expressing_agent.en'
diff --git a/agentuniverse/agent/default/expressing_agent.py b/agentuniverse/agent/default/expressing_agent/expressing_agent.py
similarity index 95%
rename from agentuniverse/agent/default/expressing_agent.py
rename to agentuniverse/agent/default/expressing_agent/expressing_agent.py
index 8d51c275..a41c2ab9 100644
--- a/agentuniverse/agent/default/expressing_agent.py
+++ b/agentuniverse/agent/default/expressing_agent/expressing_agent.py
@@ -31,6 +31,7 @@ def parse_input(self, input_object: InputObject, planner_input: dict) -> dict:
         """
         planner_input['input'] = input_object.get_data('input')
         planner_input['background'] = self.build_background(input_object)
+        self.agent_model.profile.setdefault('prompt_version', 'default_expressing_agent.cn')
         return planner_input
 
     def parse_result(self, planner_result: dict) -> dict:
diff --git a/agentuniverse/agent/default/expressing_agent.yaml b/agentuniverse/agent/default/expressing_agent/expressing_agent.yaml
similarity index 79%
rename from agentuniverse/agent/default/expressing_agent.yaml
rename to agentuniverse/agent/default/expressing_agent/expressing_agent.yaml
index c2b14526..925f8d20 100644
--- a/agentuniverse/agent/default/expressing_agent.yaml
+++ b/agentuniverse/agent/default/expressing_agent/expressing_agent.yaml
@@ -2,7 +2,6 @@ info:
   name: 'ExpressingAgent'
   description: 'expressing agent'
 profile:
-  prompt_version:
   llm_model:
     name: 'default_openai_llm'
     model_name: 'gpt-3.5-turbo'
@@ -14,5 +13,5 @@ memory:
   name: ''
 metadata:
   type: 'AGENT'
-  module: 'agentuniverse.agent.default.expressing_agent'
+  module: 'agentuniverse.agent.default.expressing_agent.expressing_agent'
   class: 'ExpressingAgent'
\ No newline at end of file
diff --git a/agentuniverse/agent/default/peer_agent/__init__.py b/agentuniverse/agent/default/peer_agent/__init__.py
new file mode 100644
index 00000000..6ef78edc
--- /dev/null
+++ b/agentuniverse/agent/default/peer_agent/__init__.py
@@ -0,0 +1,7 @@
+# !/usr/bin/env python3
+# -*- coding:utf-8 -*-
+
+# @Time    : 2024/5/7 14:35
+# @Author  : wangchongshi
+# @Email   : wangchongshi.wcs@antgroup.com
+# @FileName: __init__.py.py
diff --git a/agentuniverse/agent/default/peer_agent.py b/agentuniverse/agent/default/peer_agent/peer_agent.py
similarity index 100%
rename from agentuniverse/agent/default/peer_agent.py
rename to agentuniverse/agent/default/peer_agent/peer_agent.py
diff --git a/agentuniverse/agent/default/peer_agent.yaml b/agentuniverse/agent/default/peer_agent/peer_agent.yaml
similarity index 83%
rename from agentuniverse/agent/default/peer_agent.yaml
rename to agentuniverse/agent/default/peer_agent/peer_agent.yaml
index 75e16fd6..2410d97b 100644
--- a/agentuniverse/agent/default/peer_agent.yaml
+++ b/agentuniverse/agent/default/peer_agent/peer_agent.yaml
@@ -12,5 +12,5 @@ plan:
     reviewing: 'ReviewingAgent'
 metadata:
   type: 'AGENT'
-  module: 'agentuniverse.agent.default.peer_agent'
+  module: 'agentuniverse.agent.default.peer_agent.peer_agent'
   class: 'PeerAgent'
\ No newline at end of file
diff --git a/agentuniverse/agent/default/planning_agent/__init__.py b/agentuniverse/agent/default/planning_agent/__init__.py
new file mode 100644
index 00000000..f7fe7349
--- /dev/null
+++ b/agentuniverse/agent/default/planning_agent/__init__.py
@@ -0,0 +1,7 @@
+# !/usr/bin/env python3
+# -*- coding:utf-8 -*-
+
+# @Time    : 2024/5/7 14:36
+# @Author  : wangchongshi
+# @Email   : wangchongshi.wcs@antgroup.com
+# @FileName: __init__.py.py
diff --git a/agentuniverse/agent/plan/planner/planning_planner/default_cn_prompt.yaml b/agentuniverse/agent/default/planning_agent/default_cn_prompt.yaml
similarity index 94%
rename from agentuniverse/agent/plan/planner/planning_planner/default_cn_prompt.yaml
rename to agentuniverse/agent/default/planning_agent/default_cn_prompt.yaml
index 4f82ce34..8878c13b 100644
--- a/agentuniverse/agent/plan/planner/planning_planner/default_cn_prompt.yaml
+++ b/agentuniverse/agent/default/planning_agent/default_cn_prompt.yaml
@@ -22,9 +22,11 @@ instruction: |
   背景信息是:
   {background}
   
+  今天的日期是: {date}
+
   开始!
   必须使用中文回答用户提出的问题。
   需要回答的问题是: {input}
 metadata:
   type: 'PROMPT'
-  version: 'planning_planner.default_cn'
+  version: 'default_planning_agent.cn'
diff --git a/agentuniverse/agent/plan/planner/planning_planner/default_en_prompt.yaml b/agentuniverse/agent/default/planning_agent/default_en_prompt.yaml
similarity index 95%
rename from agentuniverse/agent/plan/planner/planning_planner/default_en_prompt.yaml
rename to agentuniverse/agent/default/planning_agent/default_en_prompt.yaml
index 8029a09d..b0eca499 100644
--- a/agentuniverse/agent/plan/planner/planning_planner/default_en_prompt.yaml
+++ b/agentuniverse/agent/default/planning_agent/default_en_prompt.yaml
@@ -22,9 +22,11 @@ instruction: |
   Background information is.
   {background}
   
+  Today's date is: {date}
+  
   Start!
   You must answer user questions in English.
   The question that needs to be answered is: {input}
 metadata:
   type: 'PROMPT'
-  version: 'planning_planner.default_en'
+  version: 'default_planning_agent.en'
diff --git a/agentuniverse/agent/default/planning_agent.py b/agentuniverse/agent/default/planning_agent/planning_agent.py
similarity index 94%
rename from agentuniverse/agent/default/planning_agent.py
rename to agentuniverse/agent/default/planning_agent/planning_agent.py
index ead5576e..33ab76d7 100644
--- a/agentuniverse/agent/default/planning_agent.py
+++ b/agentuniverse/agent/default/planning_agent/planning_agent.py
@@ -32,6 +32,7 @@ def parse_input(self, input_object: InputObject, planner_input: dict) -> dict:
         """
         planner_input['input'] = input_object.get_data('input')
         planner_input['expert_framework'] = input_object.get_data('expert_framework')
+        self.agent_model.profile.setdefault('prompt_version', 'default_planning_agent.cn')
         return planner_input
 
     def parse_result(self, planner_result: dict) -> dict:
diff --git a/agentuniverse/agent/default/planning_agent.yaml b/agentuniverse/agent/default/planning_agent/planning_agent.yaml
similarity index 79%
rename from agentuniverse/agent/default/planning_agent.yaml
rename to agentuniverse/agent/default/planning_agent/planning_agent.yaml
index 2743b58c..8477db27 100644
--- a/agentuniverse/agent/default/planning_agent.yaml
+++ b/agentuniverse/agent/default/planning_agent/planning_agent.yaml
@@ -2,7 +2,6 @@ info:
   name: 'PlanningAgent'
   description: 'planning agent'
 profile:
-  prompt_version:
   llm_model:
     name: 'default_openai_llm'
     model_name: 'gpt-3.5-turbo'
@@ -14,5 +13,5 @@ memory:
   name: ''
 metadata:
   type: 'AGENT'
-  module: 'agentuniverse.agent.default.planning_agent'
+  module: 'agentuniverse.agent.default.planning_agent.planning_agent'
   class: 'PlanningAgent'
\ No newline at end of file
diff --git a/agentuniverse/agent/default/rag_agent/__init__.py b/agentuniverse/agent/default/rag_agent/__init__.py
new file mode 100644
index 00000000..6ef78edc
--- /dev/null
+++ b/agentuniverse/agent/default/rag_agent/__init__.py
@@ -0,0 +1,7 @@
+# !/usr/bin/env python3
+# -*- coding:utf-8 -*-
+
+# @Time    : 2024/5/7 14:35
+# @Author  : wangchongshi
+# @Email   : wangchongshi.wcs@antgroup.com
+# @FileName: __init__.py.py
diff --git a/agentuniverse/agent/plan/planner/rag_planner/default_cn_prompt.yaml b/agentuniverse/agent/default/rag_agent/default_cn_prompt.yaml
similarity index 91%
rename from agentuniverse/agent/plan/planner/rag_planner/default_cn_prompt.yaml
rename to agentuniverse/agent/default/rag_agent/default_cn_prompt.yaml
index 3f4adbc6..6a49f543 100644
--- a/agentuniverse/agent/plan/planner/rag_planner/default_cn_prompt.yaml
+++ b/agentuniverse/agent/default/rag_agent/default_cn_prompt.yaml
@@ -16,9 +16,11 @@ instruction: |
   背景信息是:
   {background}
 
+  今天的日期是: {date}
+
   开始!
 
   需要回答的问题是: {input}
 metadata:
   type: 'PROMPT'
-  version: 'rag_planner.default_cn'
+  version: 'default_rag_agent.cn'
diff --git a/agentuniverse/agent/plan/planner/rag_planner/default_en_prompt.yaml b/agentuniverse/agent/default/rag_agent/default_en_prompt.yaml
similarity index 93%
rename from agentuniverse/agent/plan/planner/rag_planner/default_en_prompt.yaml
rename to agentuniverse/agent/default/rag_agent/default_en_prompt.yaml
index cbd8d503..bead6484 100644
--- a/agentuniverse/agent/plan/planner/rag_planner/default_en_prompt.yaml
+++ b/agentuniverse/agent/default/rag_agent/default_en_prompt.yaml
@@ -16,9 +16,11 @@ instruction: |
   Background information:
   {background}
   
+  Today's date is: {date}
+
   Let's get started!
   
   The question that needs to be answered is: {input}
 metadata:
   type: 'PROMPT'
-  version: 'rag_planner.default_en'
+  version: 'default_rag_agent.en'
diff --git a/agentuniverse/agent/default/rag_agent.py b/agentuniverse/agent/default/rag_agent/rag_agent.py
similarity index 93%
rename from agentuniverse/agent/default/rag_agent.py
rename to agentuniverse/agent/default/rag_agent/rag_agent.py
index a2587814..75b35ec1 100644
--- a/agentuniverse/agent/default/rag_agent.py
+++ b/agentuniverse/agent/default/rag_agent/rag_agent.py
@@ -31,6 +31,7 @@ def parse_input(self, input_object: InputObject, planner_input: dict) -> dict:
         """
         input = input_object.get_data('input')
         planner_input['input'] = input
+        self.agent_model.profile.setdefault('prompt_version', 'default_rag_agent.cn')
         return planner_input
 
     def parse_result(self, planner_result: dict) -> dict:
diff --git a/agentuniverse/agent/default/rag_agent.yaml b/agentuniverse/agent/default/rag_agent/rag_agent.yaml
similarity index 76%
rename from agentuniverse/agent/default/rag_agent.yaml
rename to agentuniverse/agent/default/rag_agent/rag_agent.yaml
index f5cd3d27..c7e5a902 100644
--- a/agentuniverse/agent/default/rag_agent.yaml
+++ b/agentuniverse/agent/default/rag_agent/rag_agent.yaml
@@ -2,7 +2,6 @@ info:
   name: 'rag_agent'
   description: 'rag agent'
 profile:
-  prompt_version:
   llm_model:
     name: 'default_openai_llm'
     model_name: 'gpt-4'
@@ -11,5 +10,5 @@ plan:
     name: 'rag_planner'
 metadata:
   type: 'AGENT'
-  module: 'agentuniverse.agent.default.rag_agent'
+  module: 'agentuniverse.agent.default.rag_agent.rag_agent'
   class: 'RagAgent'
\ No newline at end of file
diff --git a/agentuniverse/agent/default/reviewing_agent/__init__.py b/agentuniverse/agent/default/reviewing_agent/__init__.py
new file mode 100644
index 00000000..ceb3bc78
--- /dev/null
+++ b/agentuniverse/agent/default/reviewing_agent/__init__.py
@@ -0,0 +1,7 @@
+# !/usr/bin/env python3
+# -*- coding:utf-8 -*-
+
+# @Time    : 2024/5/7 14:44
+# @Author  : wangchongshi
+# @Email   : wangchongshi.wcs@antgroup.com
+# @FileName: __init__.py.py
diff --git a/agentuniverse/agent/plan/planner/reviewing_planner/default_cn_prompt.yaml b/agentuniverse/agent/default/reviewing_agent/default_cn_prompt.yaml
similarity index 94%
rename from agentuniverse/agent/plan/planner/reviewing_planner/default_cn_prompt.yaml
rename to agentuniverse/agent/default/reviewing_agent/default_cn_prompt.yaml
index c40559af..03ed221f 100644
--- a/agentuniverse/agent/plan/planner/reviewing_planner/default_cn_prompt.yaml
+++ b/agentuniverse/agent/default/reviewing_agent/default_cn_prompt.yaml
@@ -19,10 +19,12 @@ instruction: |
   背景信息是:
   {background}
   
+  今天的日期是: {date}
+
   开始!
   必须使用中文回答用户提出的问题。
   指定的问题是: {input}
   给出的答案是: {expressing_result}
 metadata:
   type: 'PROMPT'
-  version: 'reviewing_planner.default_cn'
+  version: 'default_reviewing_agent.cn'
diff --git a/agentuniverse/agent/plan/planner/reviewing_planner/default_en_prompt.yaml b/agentuniverse/agent/default/reviewing_agent/default_en_prompt.yaml
similarity index 95%
rename from agentuniverse/agent/plan/planner/reviewing_planner/default_en_prompt.yaml
rename to agentuniverse/agent/default/reviewing_agent/default_en_prompt.yaml
index 516a9403..2bbddf38 100644
--- a/agentuniverse/agent/plan/planner/reviewing_planner/default_en_prompt.yaml
+++ b/agentuniverse/agent/default/reviewing_agent/default_en_prompt.yaml
@@ -19,10 +19,12 @@ instruction: |
   Background information:
   {background}
   
+  Today's date is: {date}
+
   Let's begin!
   You must answer user questions in English.
   The specified question is: {input}
   The provided answer is: {expressing_result}
 metadata:
   type: 'PROMPT'
-  version: 'reviewing_planner.default_en'
+  version: 'default_reviewing_agent.en'
diff --git a/agentuniverse/agent/default/reviewing_agent.py b/agentuniverse/agent/default/reviewing_agent/reviewing_agent.py
similarity index 94%
rename from agentuniverse/agent/default/reviewing_agent.py
rename to agentuniverse/agent/default/reviewing_agent/reviewing_agent.py
index 91f21041..24780e73 100644
--- a/agentuniverse/agent/default/reviewing_agent.py
+++ b/agentuniverse/agent/default/reviewing_agent/reviewing_agent.py
@@ -32,6 +32,7 @@ def parse_input(self, input_object: InputObject, planner_input: dict) -> dict:
         """
         planner_input['input'] = input_object.get_data('input')
         planner_input['expressing_result'] = input_object.get_data('expressing_result').get_data('output')
+        self.agent_model.profile.setdefault('prompt_version', 'default_reviewing_agent.cn')
         return planner_input
 
     def parse_result(self, planner_result: dict) -> dict:
@@ -51,7 +52,7 @@ def parse_result(self, planner_result: dict) -> dict:
             is_useful = False
         is_useful = bool(is_useful)
         if is_useful:
-            score = 60
+            score = 80
         else:
             score = 0
 
diff --git a/agentuniverse/agent/default/reviewing_agent.yaml b/agentuniverse/agent/default/reviewing_agent/reviewing_agent.yaml
similarity index 79%
rename from agentuniverse/agent/default/reviewing_agent.yaml
rename to agentuniverse/agent/default/reviewing_agent/reviewing_agent.yaml
index f895cf61..2e4111c0 100644
--- a/agentuniverse/agent/default/reviewing_agent.yaml
+++ b/agentuniverse/agent/default/reviewing_agent/reviewing_agent.yaml
@@ -2,7 +2,6 @@ info:
   name: 'ReviewingAgent'
   description: 'reviewing agent'
 profile:
-  prompt_version:
   llm_model:
     name: 'default_openai_llm'
     model_name: 'gpt-3.5-turbo'
@@ -14,5 +13,5 @@ memory:
   name: ''
 metadata:
   type: 'AGENT'
-  module: 'agentuniverse.agent.default.reviewing_agent'
+  module: 'agentuniverse.agent.default.reviewing_agent.reviewing_agent'
   class: 'ReviewingAgent'
\ No newline at end of file
diff --git a/agentuniverse/agent/plan/planner/executing_planner/executing_planner.py b/agentuniverse/agent/plan/planner/executing_planner/executing_planner.py
index b35ea313..e8190ce0 100644
--- a/agentuniverse/agent/plan/planner/executing_planner/executing_planner.py
+++ b/agentuniverse/agent/plan/planner/executing_planner/executing_planner.py
@@ -36,11 +36,12 @@ def invoke(self, agent_model: AgentModel, planner_input: dict, input_object: Inp
 
         memory: BaseMemory = self.handle_memory(agent_model, planner_input)
 
-        self.handle_action(agent_model, planner_input, input_object)
+        self.handle_all_actions(agent_model, planner_input, input_object)
 
         llm: LLM = self.handle_llm(agent_model)
 
         prompt: Prompt = self.handle_prompt(agent_model, planner_input)
+        process_llm_token(llm, prompt.as_langchain(), agent_model.profile, planner_input)
 
         llm_chain = LLMChain(llm=llm.as_langchain(),
                              prompt=prompt.as_langchain(),
@@ -60,22 +61,25 @@ def handle_prompt(self, agent_model: AgentModel, planner_input: dict) -> Prompt:
 
         profile: dict = agent_model.profile
 
-        origin_instruction = profile.get('instruction')
-        user_instruction = expert_framework + origin_instruction if origin_instruction else origin_instruction
+        profile_instruction = profile.get('instruction')
+        profile_instruction = expert_framework + profile_instruction if profile_instruction else profile_instruction
 
-        user_prompt_model: AgentPromptModel = AgentPromptModel(introduction=profile.get('introduction'),
-                                                               target=profile.get('target'),
-                                                               instruction=user_instruction)
+        profile_prompt_model: AgentPromptModel = AgentPromptModel(introduction=profile.get('introduction'),
+                                                                  target=profile.get('target'),
+                                                                  instruction=profile_instruction)
 
         # get the prompt by the prompt version
-        prompt_version: str = profile.get('prompt_version') or 'executing_planner.default_cn'
-        prompt: Prompt = PromptManager().get_instance_obj(prompt_version)
-
-        system_prompt_model: AgentPromptModel = AgentPromptModel(introduction=prompt.introduction,
-                                                                 target=prompt.target,
-                                                                 instruction=expert_framework + prompt.instruction)
-
-        prompt: Prompt = Prompt().build_prompt(user_prompt_model, system_prompt_model,
-                                               self.prompt_assemble_order)
-        process_llm_token(prompt.as_langchain(), profile, planner_input)
-        return prompt
+        prompt_version: str = profile.get('prompt_version')
+        version_prompt: Prompt = PromptManager().get_instance_obj(prompt_version)
+
+        if version_prompt is None and not profile_prompt_model:
+            raise Exception("Either the `prompt_version` or `introduction & target & instruction`"
+                            " in agent profile configuration should be provided.")
+        if version_prompt:
+            version_prompt_model: AgentPromptModel = AgentPromptModel(
+                introduction=getattr(version_prompt, 'introduction', ''),
+                target=getattr(version_prompt, 'target', ''),
+                instruction=expert_framework + getattr(version_prompt, 'instruction', ''))
+            profile_prompt_model = profile_prompt_model + version_prompt_model
+
+        return Prompt().build_prompt(profile_prompt_model, self.prompt_assemble_order)
diff --git a/agentuniverse/agent/plan/planner/expressing_planner/expressing_planner.py b/agentuniverse/agent/plan/planner/expressing_planner/expressing_planner.py
index eb2ffc44..d3e8a614 100644
--- a/agentuniverse/agent/plan/planner/expressing_planner/expressing_planner.py
+++ b/agentuniverse/agent/plan/planner/expressing_planner/expressing_planner.py
@@ -38,6 +38,7 @@ def invoke(self, agent_model: AgentModel, planner_input: dict, input_object: Inp
         llm: LLM = self.handle_llm(agent_model)
 
         prompt: Prompt = self.handle_prompt(agent_model, planner_input)
+        process_llm_token(llm, prompt.as_langchain(), agent_model.profile, planner_input)
 
         llm_chain = LLMChain(llm=llm.as_langchain(),
                              prompt=prompt.as_langchain(),
@@ -58,22 +59,25 @@ def handle_prompt(self, agent_model: AgentModel, planner_input: dict) -> Prompt:
 
         profile: dict = agent_model.profile
 
-        origin_instruction = profile.get('instruction')
-        user_instruction = expert_framework + origin_instruction if origin_instruction else origin_instruction
+        profile_instruction = profile.get('instruction')
+        profile_instruction = expert_framework + profile_instruction if profile_instruction else profile_instruction
 
-        user_prompt_model: AgentPromptModel = AgentPromptModel(introduction=profile.get('introduction'),
-                                                               target=profile.get('target'),
-                                                               instruction=user_instruction)
+        profile_prompt_model: AgentPromptModel = AgentPromptModel(introduction=profile.get('introduction'),
+                                                                  target=profile.get('target'),
+                                                                  instruction=profile_instruction)
 
         # get the prompt by the prompt version
-        prompt_version: str = profile.get('prompt_version') or 'expressing_planner.default_cn'
-        prompt: Prompt = PromptManager().get_instance_obj(prompt_version)
-
-        system_prompt_model: AgentPromptModel = AgentPromptModel(introduction=prompt.introduction,
-                                                                 target=prompt.target,
-                                                                 instruction=expert_framework + prompt.instruction)
-
-        prompt: Prompt = Prompt().build_prompt(user_prompt_model, system_prompt_model,
-                                               self.prompt_assemble_order)
-        process_llm_token(prompt.as_langchain(), profile, planner_input)
-        return prompt
+        prompt_version: str = profile.get('prompt_version')
+        version_prompt: Prompt = PromptManager().get_instance_obj(prompt_version)
+
+        if version_prompt is None and not profile_prompt_model:
+            raise Exception("Either the `prompt_version` or `introduction & target & instruction`"
+                            " in agent profile configuration should be provided.")
+        if version_prompt:
+            version_prompt_model: AgentPromptModel = AgentPromptModel(
+                introduction=getattr(version_prompt, 'introduction', ''),
+                target=getattr(version_prompt, 'target', ''),
+                instruction=expert_framework + getattr(version_prompt, 'instruction', ''))
+            profile_prompt_model = profile_prompt_model + version_prompt_model
+
+        return Prompt().build_prompt(profile_prompt_model, self.prompt_assemble_order)
diff --git a/agentuniverse/agent/plan/planner/peer_planner/peer_planner.py b/agentuniverse/agent/plan/planner/peer_planner/peer_planner.py
index 47f9c001..b00e7eac 100644
--- a/agentuniverse/agent/plan/planner/peer_planner/peer_planner.py
+++ b/agentuniverse/agent/plan/planner/peer_planner/peer_planner.py
@@ -108,12 +108,13 @@ def agents_run(self, agents: dict, planner_config: dict, agent_input: dict, inpu
         reviewingAgent = agents.get('reviewing')
 
         for _ in range(retry_count):
-            LOGGER.info(f"Start execution sub agents, retry_count is {_}.")
+            LOGGER.info(f"Starting peer agents, retry_count is {_}.")
             if not planning_result or jump_step == "planning":
                 if not planningAgent:
                     LOGGER.warn("no planning agent, use default.")
                     planning_result = OutputObject({"framework": [agent_input.get('input')]})
                 else:
+                    LOGGER.info(f"Starting planning agent.")
                     planning_result = planningAgent.run(**input_object.to_dict())
 
                 input_object.add_data('planning_result', planning_result)
@@ -128,6 +129,7 @@ def agents_run(self, agents: dict, planner_config: dict, agent_input: dict, inpu
                     LOGGER.warn("no executing agent, use default.")
                     executing_result = OutputObject({})
                 else:
+                    LOGGER.info(f"Starting executing agent.")
                     executing_result = executingAgent.run(**input_object.to_dict())
 
                 input_object.add_data('executing_result', executing_result)
@@ -144,6 +146,7 @@ def agents_run(self, agents: dict, planner_config: dict, agent_input: dict, inpu
                     LOGGER.warn("no expression agent, use default.")
                     expressing_result = OutputObject({})
                 else:
+                    LOGGER.info(f"Starting expressing agent.")
                     expressing_result = expressingAgent.run(**input_object.to_dict())
 
                 input_object.add_data('expressing_result', expressing_result)
@@ -164,6 +167,7 @@ def agents_run(self, agents: dict, planner_config: dict, agent_input: dict, inpu
                     result['result'] = loopResults
                     return result
                 else:
+                    LOGGER.info(f"Starting reviewing agent.")
                     reviewing_result = reviewingAgent.run(**input_object.to_dict())
                     input_object.add_data('evaluator_result', reviewing_result)
 
diff --git a/agentuniverse/agent/plan/planner/planner.py b/agentuniverse/agent/plan/planner/planner.py
index 62fe1ad8..9bf1aa0f 100644
--- a/agentuniverse/agent/plan/planner/planner.py
+++ b/agentuniverse/agent/plan/planner/planner.py
@@ -92,8 +92,8 @@ def handle_memory(self, agent_model: AgentModel, planner_input: dict) -> BaseMem
         planner_input['chat_history'] = langchain_memory.load_memory_str
         return langchain_memory
 
-    def handle_action(self, agent_model: AgentModel, planner_input: dict, input_object: InputObject):
-        """Tool or knowledge processing.
+    def handle_all_actions(self, agent_model: AgentModel, planner_input: dict, input_object: InputObject):
+        """Tool and knowledge processing.
 
         Args:
             agent_model (AgentModel): Agent model object.
diff --git a/agentuniverse/agent/plan/planner/planning_planner/planning_planner.py b/agentuniverse/agent/plan/planner/planning_planner/planning_planner.py
index 82f224bb..62966df2 100644
--- a/agentuniverse/agent/plan/planner/planning_planner/planning_planner.py
+++ b/agentuniverse/agent/plan/planner/planning_planner/planning_planner.py
@@ -39,6 +39,7 @@ def invoke(self, agent_model: AgentModel, planner_input: dict,
         llm: LLM = self.handle_llm(agent_model)
 
         prompt: Prompt = self.handle_prompt(agent_model, planner_input)
+        process_llm_token(llm, prompt.as_langchain(), agent_model.profile, planner_input)
 
         llm_chain = LLMChain(llm=llm.as_langchain(),
                              prompt=prompt.as_langchain(),
@@ -59,21 +60,25 @@ def handle_prompt(self, agent_model: AgentModel, planner_input: dict) -> Prompt:
 
         profile: dict = agent_model.profile
 
-        origin_instruction = profile.get('instruction')
-        user_instruction = expert_framework + origin_instruction if origin_instruction else origin_instruction
+        profile_instruction = profile.get('instruction')
+        profile_instruction = expert_framework + profile_instruction if profile_instruction else profile_instruction
 
-        user_prompt_model: AgentPromptModel = AgentPromptModel(introduction=profile.get('introduction'),
-                                                               target=profile.get('target'),
-                                                               instruction=user_instruction)
+        profile_prompt_model: AgentPromptModel = AgentPromptModel(introduction=profile.get('introduction'),
+                                                                  target=profile.get('target'),
+                                                                  instruction=profile_instruction)
 
         # get the prompt by the prompt version
-        prompt_version: str = profile.get('prompt_version') or 'planning_planner.default_cn'
-        prompt: Prompt = PromptManager().get_instance_obj(prompt_version)
-
-        system_prompt_model: AgentPromptModel = AgentPromptModel(introduction=prompt.introduction,
-                                                                 target=prompt.target,
-                                                                 instruction=expert_framework + prompt.instruction)
-        prompt = Prompt().build_prompt(user_prompt_model, system_prompt_model,
-                                       self.prompt_assemble_order)
-        process_llm_token(prompt.as_langchain(), profile, planner_input)
-        return prompt
+        prompt_version: str = profile.get('prompt_version')
+        version_prompt: Prompt = PromptManager().get_instance_obj(prompt_version)
+
+        if version_prompt is None and not profile_prompt_model:
+            raise Exception("Either the `prompt_version` or `introduction & target & instruction`"
+                            " in agent profile configuration should be provided.")
+        if version_prompt:
+            version_prompt_model: AgentPromptModel = AgentPromptModel(
+                introduction=getattr(version_prompt, 'introduction', ''),
+                target=getattr(version_prompt, 'target', ''),
+                instruction=expert_framework + getattr(version_prompt, 'instruction', ''))
+            profile_prompt_model = profile_prompt_model + version_prompt_model
+
+        return Prompt().build_prompt(profile_prompt_model, self.prompt_assemble_order)
diff --git a/agentuniverse/agent/plan/planner/rag_planner/rag_planner.py b/agentuniverse/agent/plan/planner/rag_planner/rag_planner.py
index 90032f55..d5a58043 100644
--- a/agentuniverse/agent/plan/planner/rag_planner/rag_planner.py
+++ b/agentuniverse/agent/plan/planner/rag_planner/rag_planner.py
@@ -36,11 +36,12 @@ def invoke(self, agent_model: AgentModel, planner_input: dict,
         """
         memory: BaseMemory = self.handle_memory(agent_model, planner_input)
 
-        self.handle_action(agent_model, planner_input, input_object)
+        self.handle_all_actions(agent_model, planner_input, input_object)
 
         llm: LLM = self.handle_llm(agent_model)
 
         prompt: Prompt = self.handle_prompt(agent_model, planner_input)
+        process_llm_token(llm, prompt.as_langchain(), agent_model.profile, planner_input)
 
         llm_chain = LLMChain(llm=llm.as_langchain(),
                              prompt=prompt.as_langchain(),
@@ -58,19 +59,22 @@ def handle_prompt(self, agent_model: AgentModel, planner_input: dict) -> Prompt:
         """
         profile: dict = agent_model.profile
 
-        user_prompt_model: AgentPromptModel = AgentPromptModel(introduction=profile.get('introduction'),
-                                                               target=profile.get('target'),
-                                                               instruction=profile.get('instruction'))
+        profile_prompt_model: AgentPromptModel = AgentPromptModel(introduction=profile.get('introduction'),
+                                                                  target=profile.get('target'),
+                                                                  instruction=profile.get('instruction'))
 
         # get the prompt by the prompt version
-        prompt_version: str = profile.get('prompt_version') or 'rag_planner.default_cn'
-        prompt: Prompt = PromptManager().get_instance_obj(prompt_version)
-
-        system_prompt_model: AgentPromptModel = AgentPromptModel(introduction=prompt.introduction,
-                                                                 target=prompt.target,
-                                                                 instruction=prompt.instruction)
-
-        prompt = Prompt().build_prompt(user_prompt_model, system_prompt_model,
-                                       self.prompt_assemble_order)
-        process_llm_token(prompt.as_langchain(), profile, planner_input)
-        return prompt
+        prompt_version: str = profile.get('prompt_version')
+        version_prompt: Prompt = PromptManager().get_instance_obj(prompt_version)
+
+        if version_prompt is None and not profile_prompt_model:
+            raise Exception("Either the `prompt_version` or `introduction & target & instruction`"
+                            " in agent profile configuration should be provided.")
+        if version_prompt:
+            version_prompt_model: AgentPromptModel = AgentPromptModel(
+                introduction=getattr(version_prompt, 'introduction', ''),
+                target=getattr(version_prompt, 'target', ''),
+                instruction=getattr(version_prompt, 'instruction', ''))
+            profile_prompt_model = profile_prompt_model + version_prompt_model
+
+        return Prompt().build_prompt(profile_prompt_model, self.prompt_assemble_order)
diff --git a/agentuniverse/agent/plan/planner/reviewing_planner/reviewing_planner.py b/agentuniverse/agent/plan/planner/reviewing_planner/reviewing_planner.py
index c470b04d..a4c23ede 100644
--- a/agentuniverse/agent/plan/planner/reviewing_planner/reviewing_planner.py
+++ b/agentuniverse/agent/plan/planner/reviewing_planner/reviewing_planner.py
@@ -38,6 +38,7 @@ def invoke(self, agent_model: AgentModel, planner_input: dict, input_object: Inp
         llm: LLM = self.handle_llm(agent_model)
 
         prompt: Prompt = self.handle_prompt(agent_model, planner_input)
+        process_llm_token(llm, prompt.as_langchain(), agent_model.profile, planner_input)
 
         llm_chain = LLMChain(llm=llm.as_langchain(),
                              prompt=prompt.as_langchain(),
@@ -58,22 +59,25 @@ def handle_prompt(self, agent_model: AgentModel, planner_input: dict) -> Prompt:
 
         profile: dict = agent_model.profile
 
-        origin_instruction = profile.get('instruction')
-        user_instruction = expert_framework + origin_instruction if origin_instruction else origin_instruction
+        profile_instruction = profile.get('instruction')
+        profile_instruction = expert_framework + profile_instruction if profile_instruction else profile_instruction
 
-        user_prompt_model: AgentPromptModel = AgentPromptModel(introduction=profile.get('introduction'),
-                                                               target=profile.get('target'),
-                                                               instruction=user_instruction)
+        profile_prompt_model: AgentPromptModel = AgentPromptModel(introduction=profile.get('introduction'),
+                                                                  target=profile.get('target'),
+                                                                  instruction=profile_instruction)
 
         # get the prompt by the prompt version
-        prompt_version: str = profile.get('prompt_version') or 'reviewing_planner.default_cn'
-        prompt: Prompt = PromptManager().get_instance_obj(prompt_version)
-
-        system_prompt_model: AgentPromptModel = AgentPromptModel(introduction=prompt.introduction,
-                                                                 target=prompt.target,
-                                                                 instruction=expert_framework + prompt.instruction)
-
-        prompt: Prompt = Prompt().build_prompt(user_prompt_model, system_prompt_model,
-                                               self.prompt_assemble_order)
-        process_llm_token(prompt.as_langchain(), profile, planner_input)
-        return prompt
+        prompt_version: str = profile.get('prompt_version')
+        version_prompt: Prompt = PromptManager().get_instance_obj(prompt_version)
+
+        if version_prompt is None and not profile_prompt_model:
+            raise Exception("Either the `prompt_version` or `introduction & target & instruction`"
+                            " in agent profile configuration should be provided.")
+        if version_prompt:
+            version_prompt_model: AgentPromptModel = AgentPromptModel(
+                introduction=getattr(version_prompt, 'introduction', ''),
+                target=getattr(version_prompt, 'target', ''),
+                instruction=expert_framework + getattr(version_prompt, 'instruction', ''))
+            profile_prompt_model = profile_prompt_model + version_prompt_model
+
+        return Prompt().build_prompt(profile_prompt_model, self.prompt_assemble_order)
diff --git a/agentuniverse/base/util/prompt_util.py b/agentuniverse/base/util/prompt_util.py
index 90a3e836..65d43e5d 100644
--- a/agentuniverse/base/util/prompt_util.py
+++ b/agentuniverse/base/util/prompt_util.py
@@ -19,31 +19,26 @@
 from agentuniverse.prompt.enum import PromptProcessEnum
 
 
-def summarize_by_stuff(texts: List[str], llm: LLM, summary_prompt_version: str):
+def summarize_by_stuff(texts: List[str], llm: LLM, summary_prompt):
     """
     stuff summarization -- general method
     """
-    summary_prompt = PromptManager().get_instance_obj(summary_prompt_version)
     stuff_chain = load_summarize_chain(llm.as_langchain(), chain_type='stuff', verbose=True,
                                        prompt=summary_prompt.as_langchain())
-    return asyncio.run(stuff_chain.arun([Document(page_content=text) for text in texts]))
+    return stuff_chain.run([Document(page_content=text) for text in texts])
 
 
-def summarize_by_map_reduce(texts: List[str], llm: LLM, agent_llm: LLM, summary_prompt_version: str,
-                            combine_prompt_version: str):
+def summarize_by_map_reduce(texts: List[str], llm: LLM, summary_prompt, combine_prompt):
     """
     map reduce summarization -- general method
     """
-    texts = split_texts(texts, agent_llm)
-    summary_prompt = PromptManager().get_instance_obj(summary_prompt_version)
-    combine_prompt = PromptManager().get_instance_obj(combine_prompt_version)
     map_reduce_chain = load_summarize_chain(llm.as_langchain(), chain_type='map_reduce', verbose=True,
                                             map_prompt=summary_prompt.as_langchain(),
                                             combine_prompt=combine_prompt.as_langchain())
-    return asyncio.run(map_reduce_chain.arun([Document(page_content=text) for text in texts]))
+    return map_reduce_chain.run([Document(page_content=text) for text in texts])
 
 
-def split_text_on_tokens(text: str, text_token, chunk_size=800, chunk_overlap=100) -> List[str]:
+def split_text_on_tokens(text: str, text_token: int, chunk_size=800, chunk_overlap=100) -> List[str]:
     """Split incoming text and return chunks using tokenizer."""
     # calculate the number of characters represented by each token.
     char_per_token = len(text) / text_token
@@ -68,29 +63,29 @@ def split_text_on_tokens(text: str, text_token, chunk_size=800, chunk_overlap=10
     return result
 
 
-def split_texts(texts: list[str], agent_llm: LLM, chunk_size=800, chunk_overlap=100, retry=True) -> list[str]:
+def split_texts(texts: list[str], llm: LLM, chunk_size=800, chunk_overlap=100, retry=True) -> list[str]:
     """
     split texts into chunks with the fixed token length -- general method
     """
     try:
         split_texts_res = []
         for text in texts:
-            text_token = agent_llm.get_num_tokens(text)
+            text_token = llm.get_num_tokens(text)
             split_texts_res.extend(
                 split_text_on_tokens(text=text, text_token=text_token, chunk_size=chunk_size,
                                      chunk_overlap=chunk_overlap))
         return split_texts_res
     except Exception as e:
         if retry:
-            return split_texts(texts=texts, agent_llm=agent_llm, retry=False)
+            return split_texts(texts=texts, llm=llm, retry=False)
         raise ValueError("split text failed, exception=" + str(e))
 
 
-def truncate_content(content: str, token_length: int, agent_llm: LLM) -> str:
+def truncate_content(content: str, token_length: int, llm: LLM) -> str:
     """
     truncate the content based on the llm token limit
     """
-    return str(split_texts(texts=[content], chunk_size=token_length, agent_llm=agent_llm)[0])
+    return str(split_texts(texts=[content], chunk_size=token_length, llm=llm)[0])
 
 
 def generate_template(agent_prompt_model: AgentPromptModel, prompt_assemble_order: list[str]) -> str:
@@ -111,21 +106,21 @@ def generate_template(agent_prompt_model: AgentPromptModel, prompt_assemble_orde
     return "\n".join(values)
 
 
-def process_llm_token(prompt_template: PromptTemplate, profile: dict, planner_input: dict):
+def process_llm_token(agent_llm: LLM, prompt_template: PromptTemplate, profile: dict, planner_input: dict):
     """Process the prompt template based on the prompt processor.
 
     Args:
+        agent_llm (LLM): The agent llm.
         prompt_template (PromptTemplate): The prompt template.
         profile (dict): The profile.
         planner_input (dict): The planner input.
     """
     llm_model: dict = profile.get('llm_model')
-    llm_name: str = llm_model.get('name')
 
     # get the prompt processor configuration
     prompt_processor: dict = llm_model.get('prompt_processor') or dict()
     prompt_processor_type: str = prompt_processor.get('type') or PromptProcessEnum.TRUNCATE.value
-    prompt_processor_llm: str = prompt_processor.get('llm') or llm_name
+    prompt_processor_llm: str = prompt_processor.get('llm')
 
     # get the summary and combine prompt versions
     summary_prompt_version: str = prompt_processor.get('summary_prompt_version') or 'prompt_processor.summary_cn'
@@ -133,17 +128,19 @@ def process_llm_token(prompt_template: PromptTemplate, profile: dict, planner_in
 
     prompt_input_dict = {key: planner_input[key] for key in prompt_template.input_variables if key in planner_input}
 
-    agent_llm: LLM = LLMManager().get_instance_obj(llm_name)
     # get the llm instance for prompt compression
     prompt_llm: LLM = LLMManager().get_instance_obj(prompt_processor_llm)
 
+    if prompt_llm is None:
+        prompt_llm = agent_llm
+
     prompt = prompt_template.format(**prompt_input_dict)
     # get the number of tokens in the prompt
     prompt_tokens: int = agent_llm.get_num_tokens(prompt)
 
-    remaining_tokens = agent_llm.max_context_length() - agent_llm.max_tokens
+    input_tokens = agent_llm.max_context_length() - agent_llm.max_tokens
 
-    if prompt_tokens <= remaining_tokens:
+    if prompt_tokens <= input_tokens:
         return
 
     process_prompt_type_enum = PromptProcessEnum.from_value(prompt_processor_type)
@@ -151,9 +148,14 @@ def process_llm_token(prompt_template: PromptTemplate, profile: dict, planner_in
     # compress the background in the prompt
     content = planner_input.get('background')
     if process_prompt_type_enum == PromptProcessEnum.TRUNCATE:
-        planner_input['background'] = truncate_content(content, remaining_tokens, agent_llm)
+        planner_input['background'] = truncate_content(content, input_tokens, agent_llm)
     elif process_prompt_type_enum == PromptProcessEnum.STUFF:
-        planner_input['background'] = summarize_by_stuff([content], prompt_llm, summary_prompt_version)
+        planner_input['background'] = summarize_by_stuff(texts=[content], llm=prompt_llm,
+                                                         summary_prompt=PromptManager().get_instance_obj(
+                                                             summary_prompt_version))
     elif process_prompt_type_enum == PromptProcessEnum.MAP_REDUCE:
-        planner_input['background'] = summarize_by_map_reduce([content], prompt_llm,
-                                                              agent_llm, summary_prompt_version, combine_prompt_version)
+        planner_input['background'] = summarize_by_map_reduce(texts=split_texts([content], agent_llm), llm=prompt_llm,
+                                                              summary_prompt=PromptManager().get_instance_obj(
+                                                                  summary_prompt_version),
+                                                              combine_prompt=PromptManager().get_instance_obj(
+                                                                  combine_prompt_version))
diff --git a/agentuniverse/llm/langchain_instance.py b/agentuniverse/llm/langchain_instance.py
index 736af0c4..0c61ad05 100644
--- a/agentuniverse/llm/langchain_instance.py
+++ b/agentuniverse/llm/langchain_instance.py
@@ -5,11 +5,16 @@
 # @Author  : wangchongshi
 # @Email   : wangchongshi.wcs@antgroup.com
 # @FileName: langchain_instance.py
-from typing import Any, List, Optional
+
+from typing import Any, List, Optional, AsyncIterator
 
 from langchain.callbacks.manager import AsyncCallbackManagerForLLMRun, CallbackManagerForLLMRun
 from langchain.chat_models import ChatOpenAI
 from langchain.schema import BaseMessage, ChatResult
+from langchain_community.chat_models.openai import _convert_delta_to_message_chunk
+from langchain_core.language_models.chat_models import generate_from_stream, agenerate_from_stream
+from langchain_core.messages import AIMessageChunk
+from langchain_core.outputs import ChatGenerationChunk
 
 from agentuniverse.llm.llm import LLM
 
@@ -51,10 +56,14 @@ def _generate(
             **kwargs,
     ) -> ChatResult:
         """Run the Langchain OpenAI LLM."""
+        should_stream = stream if stream is not None else self.streaming
         message_dicts, params = self._create_message_dicts(messages, stop)
         params = {**params, **kwargs}
         llm_output = self.llm.call(messages=message_dicts, **params)
-        return self._create_chat_result(llm_output.raw)
+        if not should_stream:
+            return self._create_chat_result(llm_output.raw)
+        stream_iter = self.as_langchain_chunk(llm_output)
+        return generate_from_stream(stream_iter)
 
     async def _agenerate(
             self,
@@ -65,7 +74,58 @@ async def _agenerate(
             **kwargs: Any,
     ) -> ChatResult:
         """Asynchronously run the Langchain OpenAI LLM."""
+        should_stream = stream if stream is not None else self.streaming
         message_dicts, params = self._create_message_dicts(messages, stop)
         params = {**params, **kwargs}
         llm_output = await self.llm.acall(messages=message_dicts, **params)
-        return self._create_chat_result(llm_output.raw)
+        if not should_stream:
+            return self._create_chat_result(llm_output.raw)
+        stream_iter = self.as_langchain_achunk(llm_output)
+        return await agenerate_from_stream(stream_iter)
+
+    @staticmethod
+    def as_langchain_chunk(stream, run_manager=None):
+        default_chunk_class = AIMessageChunk
+        for llm_result in stream:
+            chunk = llm_result.raw
+            if not isinstance(chunk, dict):
+                chunk = chunk.dict()
+            if len(chunk["choices"]) == 0:
+                continue
+            choice = chunk["choices"][0]
+            chunk = _convert_delta_to_message_chunk(
+                choice["delta"], default_chunk_class
+            )
+            finish_reason = choice.get("finish_reason")
+            generation_info = (
+                dict(finish_reason=finish_reason) if finish_reason is not None else None
+            )
+            default_chunk_class = chunk.__class__
+            chunk = ChatGenerationChunk(message=chunk, generation_info=generation_info)
+            yield chunk
+            if run_manager:
+                run_manager.on_llm_new_token(chunk.text, chunk=chunk)
+
+    @staticmethod
+    async def as_langchain_achunk(stream_iterator: AsyncIterator, run_manager=None) \
+            -> AsyncIterator[ChatGenerationChunk]:
+        default_chunk_class = AIMessageChunk
+        async for llm_result in stream_iterator:
+            chunk = llm_result.raw
+            if not isinstance(chunk, dict):
+                chunk = chunk.dict()
+            if len(chunk["choices"]) == 0:
+                continue
+            choice = chunk["choices"][0]
+            chunk = _convert_delta_to_message_chunk(
+                choice["delta"], default_chunk_class
+            )
+            finish_reason = choice.get("finish_reason")
+            generation_info = (
+                dict(finish_reason=finish_reason) if finish_reason is not None else None
+            )
+            default_chunk_class = chunk.__class__
+            chunk = ChatGenerationChunk(message=chunk, generation_info=generation_info)
+            yield chunk
+            if run_manager:
+                await run_manager.on_llm_new_token(token=chunk.text, chunk=chunk)
diff --git a/agentuniverse/llm/llm.py b/agentuniverse/llm/llm.py
index ad09227d..0b6d2687 100644
--- a/agentuniverse/llm/llm.py
+++ b/agentuniverse/llm/llm.py
@@ -6,7 +6,7 @@
 # @Email   : wangchongshi.wcs@antgroup.com
 # @FileName: llm.py
 from abc import abstractmethod
-from typing import Optional, Any
+from typing import Optional, Any, AsyncIterator, Iterator, Union
 from langchain_core.language_models.base import BaseLanguageModel
 
 from agentuniverse.base.component.component_base import ComponentBase
@@ -58,11 +58,11 @@ def _new_async_client(self):
         pass
 
     @abstractmethod
-    def call(self, *args: Any, **kwargs: Any) -> LLMOutput:
+    def call(self, *args: Any, **kwargs: Any) -> Union[LLMOutput, Iterator[LLMOutput]]:
         """Run the LLM."""
 
     @abstractmethod
-    async def acall(self, *args: Any, **kwargs: Any) -> LLMOutput:
+    async def acall(self, *args: Any, **kwargs: Any) -> Union[LLMOutput, AsyncIterator[LLMOutput]]:
         """Asynchronously run the LLM."""
 
     def as_langchain(self) -> BaseLanguageModel:
diff --git a/agentuniverse/llm/openai_llm.py b/agentuniverse/llm/openai_llm.py
index 8c420548..139ae49d 100644
--- a/agentuniverse/llm/openai_llm.py
+++ b/agentuniverse/llm/openai_llm.py
@@ -5,7 +5,7 @@
 # @Author  : wangchongshi
 # @Email   : wangchongshi.wcs@antgroup.com
 # @FileName: openai_llm.py
-from typing import Any, Optional
+from typing import Any, Optional, AsyncIterator, Iterator, Union
 
 import httpx
 from langchain_core.language_models.base import BaseLanguageModel
@@ -83,44 +83,49 @@ def _new_async_client(self):
             **(self.openai_client_args or {}),
         )
 
-    def call(self, messages: list, **kwargs: Any) -> LLMOutput:
+    def call(self, messages: list, **kwargs: Any) -> Union[LLMOutput, Iterator[LLMOutput]]:
         """Run the OpenAI LLM.
 
         Args:
             messages (list): The messages to send to the LLM.
             **kwargs: Arbitrary keyword arguments.
         """
+        streaming = kwargs.pop("streaming") if "streaming" in kwargs else self.streaming
         self.client = self._new_client()
         chat_completion = self.client.chat.completions.create(
             messages=messages,
             model=kwargs.pop('model', self.model_name),
             temperature=kwargs.pop('temperature', self.temperature),
-            stream=kwargs.pop('stream', self.streaming),
+            stream=kwargs.pop('stream', streaming),
             max_tokens=kwargs.pop('max_tokens', self.max_tokens),
             **kwargs,
         )
-        text = chat_completion.choices[0].message.content
-        return LLMOutput(text=text, raw=chat_completion.model_dump())
+        if not streaming:
+            text = chat_completion.choices[0].message.content
+            return LLMOutput(text=text, raw=chat_completion.model_dump())
+        return self.generate_stream_result(chat_completion)
 
-    async def acall(self, messages: list, **kwargs: Any) -> LLMOutput:
+    async def acall(self, messages: list, **kwargs: Any) -> Union[LLMOutput, AsyncIterator[LLMOutput]]:
         """Asynchronously run the OpenAI LLM.
 
         Args:
             messages (list): The messages to send to the LLM.
             **kwargs: Arbitrary keyword arguments.
         """
-
+        streaming = kwargs.pop("streaming") if "streaming" in kwargs else self.streaming
         self.async_client = self._new_async_client()
         chat_completion = await self.async_client.chat.completions.create(
             messages=messages,
             model=kwargs.pop('model', self.model_name),
             temperature=kwargs.pop('temperature', self.temperature),
-            stream=kwargs.pop('stream', self.streaming),
+            stream=kwargs.pop('stream', streaming),
             max_tokens=kwargs.pop('max_tokens', self.max_tokens),
             **kwargs,
         )
-        text = chat_completion.choices[0].message.content
-        return LLMOutput(text=text, raw=chat_completion.model_dump())
+        if not streaming:
+            text = chat_completion.choices[0].message.content
+            return LLMOutput(text=text, raw=chat_completion.model_dump())
+        return self.agenerate_stream_result(chat_completion)
 
     def as_langchain(self) -> BaseLanguageModel:
         """Convert the AgentUniverse(AU) openai llm class to the langchain openai llm class."""
@@ -161,3 +166,34 @@ def get_num_tokens(self, text: str) -> int:
         except KeyError:
             encoding = tiktoken.get_encoding("cl100k_base")
         return len(encoding.encode(text))
+
+    @staticmethod
+    def parse_result(chunk):
+        """Generate the result of the stream."""
+        chat_completion = chunk
+        if not isinstance(chunk, dict):
+            chunk = chunk.dict()
+        if len(chunk["choices"]) == 0:
+            return
+        choice = chunk["choices"][0]
+        message = choice.get("delta")
+        text = message.get("content")
+        if not text:
+            return
+        return LLMOutput(text=text, raw=chat_completion.model_dump())
+
+    @classmethod
+    def generate_stream_result(cls, stream: Iterator) -> Iterator[LLMOutput]:
+        """Generate the result of the stream."""
+        for chunk in stream:
+            llm_output = cls.parse_result(chunk)
+            if llm_output:
+                yield llm_output
+
+    @classmethod
+    async def agenerate_stream_result(cls, stream: AsyncIterator) -> AsyncIterator[LLMOutput]:
+        """Generate the result of the stream."""
+        async for chunk in stream:
+            llm_output = cls.parse_result(chunk)
+            if llm_output:
+                yield llm_output
diff --git a/agentuniverse/prompt/prompt.py b/agentuniverse/prompt/prompt.py
index aa387284..3089bfb2 100644
--- a/agentuniverse/prompt/prompt.py
+++ b/agentuniverse/prompt/prompt.py
@@ -36,19 +36,16 @@ def as_langchain(self) -> PromptTemplate:
         return PromptTemplate(template=self.prompt_template,
                               input_variables=self.input_variables)
 
-    def build_prompt(self, user_agent_prompt_model: AgentPromptModel, system_agent_prompt_model: AgentPromptModel,
-                     prompt_assemble_order: list[str]) -> 'Prompt':
+    def build_prompt(self, agent_prompt_model: AgentPromptModel, prompt_assemble_order: list[str]) -> 'Prompt':
         """Build the prompt class.
 
         Args:
-            user_agent_prompt_model (AgentPromptModel): The user agent prompt model.
-            system_agent_prompt_model (AgentPromptModel): The system agent prompt model.
+            agent_prompt_model (AgentPromptModel): The user agent prompt model.
             prompt_assemble_order (list[str]): The prompt assemble ordered list.
 
         Returns:
             PromptTemplate: The prompt template.
         """
-        agent_prompt_model = user_agent_prompt_model + system_agent_prompt_model
         self.prompt_template = generate_template(agent_prompt_model, prompt_assemble_order)
         self.input_variables = re.findall(r'\{(.*?)}', self.prompt_template)
         return self
diff --git a/agentuniverse/prompt/prompt_model.py b/agentuniverse/prompt/prompt_model.py
index 56ff5cf7..491558ff 100644
--- a/agentuniverse/prompt/prompt_model.py
+++ b/agentuniverse/prompt/prompt_model.py
@@ -26,3 +26,11 @@ def __add__(self, other):
                 value = getattr(other, key, None)
             setattr(merged_object, key, value)
         return merged_object
+
+    def __bool__(self):
+        """ Check whether the object is empty.
+
+        Return True if one of the introduction, target and instruction attribute is not empty.
+        Return False otherwise.
+        """
+        return bool(self.introduction or self.introduction or self.introduction)
diff --git a/docs/guidebook/en/0_index.md b/docs/guidebook/en/0_index.md
index f053e534..981b95cd 100644
--- a/docs/guidebook/en/0_index.md
+++ b/docs/guidebook/en/0_index.md
@@ -10,11 +10,40 @@
 
 **2. Principle Introduction**
 
+* 2.1 Framework Principles
+* 2.2 [Domain Components](2_2_Domain_Component_Principles.md)
+  * 2.2.1 Agent
+  * 2.2.2 LLM
+  * 2.2.3 Tool
+  * 2.2.4 Knowledge
+  * 2.2.5 Memory
+  * 2.2.6 Planner
+* 2.3 Technical Components
+* 2.4 Others
+  * 2.4.1 Service
+  * 2.4.2 Prompt Management
+  * 2.4.3 Multi-turn Dialogue
+  * 2.4.4 Logging
+  * 2.4.5 Data Collection
+
 **3. Component Reference Manual**
+* 3.1 Domain Components
+  * 3.1.1 Agent
+  * 3.1.2 LLM
+  * 3.1.3 Tool
+  * 3.1.4 Knowledge
+  * 3.1.5 Memory
+  * 3.1.6 Planner
+* 3.2 Technical Components
+  * 3.2.1 RPC
+  * 3.2.2 Store
+  * 3.2.3 Msg
 
 **[4. API Reference Manual](4_1_API_Reference.md)**
 
 **5. Best Practices**
+* 5.1 Operations and Deployment
+  * 5.1.1 Docker Containerization Solution
 
 **6. Series of Articles**
 
diff --git a/docs/guidebook/en/1_3_Quick_Start.md b/docs/guidebook/en/1_3_Quick_Start.md
index f5e5b42e..31285809 100644
--- a/docs/guidebook/en/1_3_Quick_Start.md
+++ b/docs/guidebook/en/1_3_Quick_Start.md
@@ -192,10 +192,12 @@ metadata:
 In `xx_service.yaml`, we define a `demo_service` configuration. The `name` field defines the name of the service, the `description` field defines the description of the service, and the `agent` field defines which agent provides the service.
 
 ### Start the Service
-You can start the service by executing the `app/bootstrap/server_application.py` file in the IDE or by entering the following command in the terminal:
+Start using the `server_application.py` file found in the `bootstrap` folder within your IDE,
+or enter the following command in the terminal to start the service interface and begin listening:
 ```shell
-# under the root directory of the project
-python app/bootstrap/server_application.py
+# under the bootstrap directory of the project
+cd `your bootstrap directory path`
+python server_application.py
 ```
 
 When the command line shows that the service is listening successfully, the service is started. By default, the service listens on the address `127.0.0.1` and port `8000`, with 5 workers. You can modify the configuration in `config/gunicorn_config.toml`.
diff --git a/docs/guidebook/en/2_2_Domain_Component_Principles.md b/docs/guidebook/en/2_2_Domain_Component_Principles.md
new file mode 100644
index 00000000..713c07d6
--- /dev/null
+++ b/docs/guidebook/en/2_2_Domain_Component_Principles.md
@@ -0,0 +1,17 @@
+# Domain Component Principles
+agentUniverse includes several domain components, which combine to form the fundamental components of the multi-agent framework, including:
+* Agent
+* LLM
+* Tool
+* Knowledge
+* Memory
+* Planner
+
+All domain components in agentUniverse follow a unified design philosophy, exhibiting the following characteristics:
+
+* Development is configuration-oriented, enhancing the efficiency of component creation and reuse.
+* Possess independent managers, providing a unified and isolated mechanism for component registration and management.
+* Standard domain definitions support the injection of all similar type components in the industry.
+* Components are customizable, opening up capabilities for all domain components to be tailored.
+
+This chapter will specifically introduce the design principles of each domain component and how to use them. Please read the sub-documents within this chapter.
\ No newline at end of file
diff --git a/docs/guidebook/en/2_3_Service.md b/docs/guidebook/en/2_3_Service.md
new file mode 100644
index 00000000..bf7ec90c
--- /dev/null
+++ b/docs/guidebook/en/2_3_Service.md
@@ -0,0 +1,31 @@
+# Service
+
+AgentUniverse allows developers to register completed Agents as a Service using a simple template definition. This enables the use of the corresponding Agent services through Web API calls after launching the built-in web server.
+
+## Registration Method
+
+### Step1: Configure Scan Path
+AgentUniverse automatically registers Service configuration files by scanning configured paths at application startup. The scanning paths are configured in the `config.toml` file:
+```toml
+[CORE_PACKAGE]
+default = ['default_scan_path']
+service = ['service_scan_path']
+```
+By default, AgentUniverse scans all paths under default or service, with the path configuration under service having higher priority than default.
+
+
+### Step2: Configuration File
+```yaml
+name: 'service_name'
+description: 'description of the service'
+agent: 'agent_name'
+metadata:
+  type: 'SERVICE'
+```
+- **`name`**: The name of the Service, which needs to be provided when calling the service through the Web API.
+- **`description`**: Description of the Service's functionality.
+- **`agent`**: The name of the Agent. For more information about Agents, please refer to [Agent]().
+- **`metadata`**: Indicates that this configuration is for a Service; no changes are needed.
+
+## Usage
+Please refer to [Web API](2_5_Web_Api.md).
\ No newline at end of file
diff --git a/docs/guidebook/en/2_4_Web_Server.md b/docs/guidebook/en/2_4_Web_Server.md
new file mode 100644
index 00000000..bad0a992
--- /dev/null
+++ b/docs/guidebook/en/2_4_Web_Server.md
@@ -0,0 +1,69 @@
+# Web Server
+
+AgentUniverse provides a web server based on Gunicorn+Flask. You can call the developed Agent services through the preset APIs in the web server.
+
+## Web Server Launch
+You need to start the web server after launching the AgentUniverse application.
+Here is an example of how to launch it:
+```python
+from agentuniverse.agent_serve.web.web_booster import start_web_server
+from agentuniverse.base.agentuniverse import AgentUniverse
+
+AgentUniverse().start()
+start_web_server()
+```
+
+## Windows Users
+If you are using AgentUniverse on Windows, due to Gunicorn compatibility issues, AgentUniverse will run the Flask program directly. You can modify the start port in start_web_server, like this:：
+```python
+from agentuniverse.agent_serve.web.web_booster import start_web_server
+
+start_web_server(bind='127.0.0.1:8888')
+```
+
+## Web Server Configuration
+The configuration of the web server consists of four levels in order of increasing priority: native Gunicorn default configuration, AgentUniverse default configuration, configuration file settings, and startup configuration. For Gunicorn's native default configuration, please refer to the official documentation for the corresponding version of Gunicorn.
+
+### AgentUniverse Default Configuration
+```python
+DEFAULT_GUNICORN_CONFIG = {
+    'bind': '127.0.0.1:8000',
+    'workers': 5,
+    'backlog': 2048,
+    'worker_class': 'gthread',
+    'threads': 4,
+    'timeout': 60,
+    'keepalive': 10
+}
+```
+AgentUniverse has pre-configured some parameters based on the framework's working characteristics, which you can modify through the configuration file below or parameters when launching the web server.
+
+### Configuration File Path
+The configuration path for the web server is specified in AgentUniverse's main configuration file `config.toml`.
+```toml
+[SUB_CONFIG_PATH]
+# Gunicorn config file path, an absolute path or a relative path based on the dir where the current config file is located.
+gunicorn_config_path = './gunicorn_config.toml'
+```
+If this parameter is in relative path format, the corresponding parent directory is the directory where the main configuration file config.toml is located.
+
+### Configuration File
+```toml
+[GUNICORN_CONFIG]
+bind = '127.0.0.1:8000'
+backlog = 2048
+worker_class = 'gthread'
+threads = 4
+workers = 5
+timeout = 60
+keepalive = 10
+```
+The configuration file is written in TOML format, and the specific configuration items are not limited to the content in the example above. You can refer to the official Gunicorn documentation for more detailed configurations.
+
+### Startup Configuration
+You can also configure the web server at startup as follows:
+```python
+from agentuniverse.agent_serve.web.web_booster import start_web_server
+
+start_web_server(bind="127.0.0.1:8002", threads=4)
+```
\ No newline at end of file
diff --git a/docs/guidebook/en/2_5_Web_Api.md b/docs/guidebook/en/2_5_Web_Api.md
new file mode 100644
index 00000000..686ad88f
--- /dev/null
+++ b/docs/guidebook/en/2_5_Web_Api.md
@@ -0,0 +1,95 @@
+# Web API
+
+The Web Server of AgentUniverse provides several API interfaces for calling Agent services, allowing developers to call Agent services through web api.
+
+For convenience, let's assume that the Web Server is started on port 8888 locally and has registered an Agent service named `demo_service`：
+```yaml
+name: 'demo_service'
+description: 'A demo service used for explaining.'
+agent: 'demo_agent'
+metadata:
+  type: 'SERVICE'
+```
+The `demo_agent` accepts a string type input parameter,
+and returns a string: `"Your input is {input}."`
+
+## /service_run
+This POST interface calls the Agent service in a synchronous manner, and the call will block until the target Agent service returns a result.
+An example call is as follows:
+```shell
+curl -X POST -H "Content-Type: application/json" -d '{"service_id":"demo_service","params":{"input":"Hello!"}}' http://127.0.0.1:8888/service_run
+```
+The expected return value example is as follows:
+```shell
+{
+        "success": true,
+        "result": "Your input is Hello!.",
+        "message": null,
+        "request_id": "7dd7d737b6b64c3c92addf541e73e97c"
+}
+```
+- **`success`**: Indicates whether the Agent call was successful or not, with values `true` and `false`.。
+- **`message`**: When the `success` value is `false`, this value represents the error message, and it is `null` when successful.
+- **`result`**: Represents the result of the execution when the Agent call is successful.
+- **`request_id`**: A random string, used for a unique request. It can be used in the [/service_run_result](#servicerunresult) interface to query the result of the corresponding request.
+
+## /service_run_stream
+
+This POST interface is similar to `/service_run`, and its call method is consistent with it:
+```shell
+curl -X POST -H "Content-Type: application/json" -d '{"service_id":"demo_service","params":{"input":"Hello!"}}' http://127.0.0.1:8888/service_run_stream
+```
+However, the return result of the Agent will be returned in a streaming manner:
+```python
+response = Response(task.stream_run(), mimetype="text/event-stream")
+response.headers['X-Request-ID'] = task.request_id
+```
+`request_id` will be included in the response header X-Request-ID.
+
+## /service_run_async
+This POST interface calls the Agent service in an asynchronous manner. The calling method is as follows:
+```shell
+curl -X POST -H "Content-Type: application/json" -d '{"service_id":"demo_service","params":{"input":"Hello!"}}' http://127.0.0.1:8888/service_run_async
+```
+The interface will return immediately:
+```shell
+{
+        "success": true,
+        "result": null,
+        "message": null,
+        "request_id": "7dd7d737b6b64c3c92addf541e73e97c"
+}
+```
+The return result will only contain the success indicating whether the call was successful or not, and the request_id indicating this call.
+For the result of the call, you need to use the request_id to query in the [/service_run_result](#servicerunresult) interface.
+
+## /service_run_result
+This GET interface allows users to check the request status with request_id, an example call is as follows:
+```shell
+ curl 'http://127.0.0.1:8888/service_run_result?request_id=8e6f17dbe7ff4730a62b4a2914d73c74'
+```
+The expected return value example is as follows:
+```shell
+{
+  "message":null,
+  "request_id":"8e6f17dbe7ff4730a62b4a2914d73c74",
+  "result":{
+    "result":"Your input is Hello!.",
+    "state":"finish",
+    "steps":[]
+    },
+  "success":true}
+
+```
+The `result` contains three parts: `result` indicates the result of the Agent service execution, `state` indicates the state of the Agent service execution, and `steps` indicates the intermediate process of the Agent service execution.  
+`state` represents the task status and includes the following scenarios:：
+```python
+@enum.unique
+class TaskStateEnum(Enum):
+    """All possible state of a web request task."""
+    INIT = "init"
+    RUNNING = "running"
+    FINISHED = "finished"
+    FAIL = "fail"
+    CANCELED = "canceled"
+```
diff --git a/docs/guidebook/en/2_6_Logging_Utils.md b/docs/guidebook/en/2_6_Logging_Utils.md
new file mode 100644
index 00000000..43b5ead3
--- /dev/null
+++ b/docs/guidebook/en/2_6_Logging_Utils.md
@@ -0,0 +1,75 @@
+# Logging Utils
+
+The log component of AgentUniverse is implemented based on loguru, providing a well-packaged global log component and customizable log components. This tutorial will first introduce the usage of the log configuration file in AgentUniverse, then explain the usage of the global log component and customizable log components in turn, and finally describe how to interface with external log service components.
+    
+## Log Configuration
+
+### Configuration File Path
+The configuration path of the log file is specified in the main configuration of AgentUniverse, config.toml.
+```toml
+[SUB_CONFIG_PATH]
+# Log config file path, an absolute path or a relative path based on the dir where the current config file is located.
+log_config_path = './log_config.toml'
+```
+ If this parameter is a relative path, its parent directory is the directory where the main configuration file, config.toml, is located.
+If this parameter does not exist, AgentUniverse will use the default log configuration, see [default configuration](#default-configuration).
+
+### Configuration File Options
+The configuration file for logs is in the toml file format; an example configuration is as follows:
+```toml
+[LOG_CONFIG]
+[LOG_CONFIG.BASIC_CONFIG]
+log_level = "INFO"
+log_path = "~/.agent_universe_log"
+log_rotation = "100 MB"
+log_retention = "7 days"
+```
+- **`log_level`**: The default log level, possible values include "TRACE", "DEBUG", "INFO", "SUCCESS", "WARNING", "ERROR", "CRITICAL". The level of the global log component will be the same as this value. When creating a custom log component, if log level is not specified, this default level will be used.
+- **`log_path`**: The log storage path, if this value is empty, a {workdir}/../../logs folder will be created as the log storage path.
+- **`log_rotation`**: This parameter accepts a duration (e.g., "1 week") or file size (e.g., "100 MB"), indicating the condition for log file rotation.
+- **`log_retention`**: This parameter accepts a duration (e.g., "7 days") indicating the retention period for old log files, which will be deleted after they expire.
+
+### Default Configuration
+Configuration not specified in the log configuration file will take the following default settings:
+- **`log_level`**: "INFO"
+- **`log_rotation`**: "10MB"
+- **`log_retention`**: "3 days"
+
+Two default log files, `afaf_all.log` and `afaf_error.log`, will be located in the log storage path. 'All' records all logs above the default log level set in the log configuration, while 'error' records only logs at the ERROR level and above. The format for log component output is:
+```python
+log_format: str = ("<green>{time:YYYY-MM-DD HH:mm:ss.SSS}</green> "
+                       "| <level>{level: <8}</level> "
+                       "| {extra[context_prefix]} "
+                       "| <cyan>{name}</cyan>"
+                       ":<cyan>{function}</cyan>"
+                       ":<cyan>{line}</cyan> "
+                       "| <level>{message}</level>")
+```
+Where `{extra[context_prefix]}` defaults to `default`, When `LOG_CONTEXT` exists in the framework context, its contents will be replaced by the contents of `LOG_CONTEXT`. For more information related to the framework context, please refer to  [Framework_Context](2_7_Framework_Context.md)。
+
+## Global Log Component
+AgentUniverse provides a directly usable log component `logging_util.Logger`, which you can introduce into your project as follows:
+```python
+from agentuniverse.base.util.logging.logging_util import LOGGER
+```
+You can use this object's different member functions to record logs of different levels:
+```python
+from agentuniverse.base.util.logging.logging_util import LOGGER
+
+LOGGER.info("This is an info log.")
+LOGGER.debug("This is a debug log.")
+LOGGER.warn("This is a warn log.")
+LOGGER.error("This is an error log.")
+```
+
+## Custom Log Components
+If you want to output and save certain logs separately, you can create a custom log component using the `get_module_logger` function::
+```python
+from agentuniverse.base.util.logging.logging_util import get_module_logger
+new_logger = get_module_logger("new_module")
+```
+Logs recorded by this new component will be saved in the log storage path, in a log file named `afaf_{module_name}.log`,  where `{module_name}` is the module name you passed into `get_module_logger`, as in the example above, the corresponding file would be `afaf_new_module.log`.
+
+## External Log Service
+
+If you want to use more log utils, please refer to [extension logging utils](3_1_Extension_Logging_Utils.md).
diff --git a/docs/guidebook/en/2_7_Framework_Context.md b/docs/guidebook/en/2_7_Framework_Context.md
new file mode 100644
index 00000000..784879c8
--- /dev/null
+++ b/docs/guidebook/en/2_7_Framework_Context.md
@@ -0,0 +1,37 @@
+# Framework Context
+
+AgentUniverse provides a context management tool that is independent on threads and coroutines level, allowing the storage and retrieval of context variables in a key-value format that need to be managed separately within threads or coroutines.
+
+## Usage
+
+### Creating Context Variables
+#### Method 1:
+```python
+from agentuniverse.base.context.framework_context import FrameworkContext
+
+with FrameworkContext({"context_var1": 1,
+                       "context_var2":"context_var"}):
+    pass
+```
+By using the `with` keyword to create a `FrameworkContext` instance, which accepts a `dict` type parameter, AgentUniverse will save all key-value pairs from the parameters to the context manager within the scope of with, and remove them upon exit.
+
+#### Method 2:
+```python
+from agentuniverse.base.context.framework_context_manager import FrameworkContextManager
+
+FrameworkContextManager().set_context("context_var", "value")
+```
+Create a new context variable with `FrameworkContextManager` directly. Variables created in this way will exist throughout the lifecycle of the thread or coroutine and can be manually deleted with following code:
+```python
+from agentuniverse.base.context.framework_context_manager import FrameworkContextManager
+
+FrameworkContextManager().del_context("context_var")
+```
+### Using Context Variables
+You can retrieve previously saved variables through the `FrameworkContextManager`：
+```python
+from agentuniverse.base.context.framework_context_manager import FrameworkContextManager
+
+FrameworkContextManager().get_context("context_var", default_value=None)
+```
+The `default_value` is `None` by default. When there is no corresponding key in the context, `default_value` is returned.
\ No newline at end of file
diff --git a/docs/guidebook/en/3_1_Extension_Logging_Utils.md b/docs/guidebook/en/3_1_Extension_Logging_Utils.md
new file mode 100644
index 00000000..a370019f
--- /dev/null
+++ b/docs/guidebook/en/3_1_Extension_Logging_Utils.md
@@ -0,0 +1,38 @@
+## Aliyun SLS
+If you want to use aliyun sls, you should install agentUniverse in this way:
+```shell
+pip install agentuniverse[log_ext]
+```
+
+You will need to make the following configuration in the log configuration file:
+```toml
+[LOG_CONFIG.EXTEND_MODULE]
+# Whether use aliyun simple log server. If value is True, you should fill the ALIYUN_SLS_CONFIG below.
+sls_log = "True"
+
+[LOG_CONFIG.ALIYUN_SLS_CONFIG]
+# Aliyun sls endpoint.
+sls_endpoint = "mock_endpoint"
+# Your sls log project name.
+sls_project = "mock_project"
+# Your sls log store name.
+sls_log_store = "mock_log_store"
+# Aliyun sls access_key_id.
+access_key_id = "mock_key_id"
+# Aliyun sls access_key_secret.
+access_key_secret = "mock_key_secret"
+# Log queue max size, antfinagentframework uses a queue to save the logs to be sent, they will be sent periodically.
+sls_log_queue_max_size = 1000
+# Interval of sending logs to aliyun sls.
+sls_log_send_interval = 3.0
+```
+- **`sls_log`**: This must be True if you need to use sls.
+- **`sls_endpoint`**: The endpoint address for Aliyun sls.
+- **`sls_project`**: The project in Aliyun sls.
+- **`sls_log_store`**: The log store in Aliyun sls.
+- **`access_key_id`**: The access key id for Aliyun sls.
+- **`access_key_secret`**: The access key secret for Aliyun sls.
+- **`sls_log_queue_max_size`**: The AgentUniverse adopts a mechanism of timing batch uploading of logs. This parameter signifies the maximum number of log entries that can be cached during each upload interval.
+- **`sls_log_send_interval`**: The interval for uploading logs to sls, in seconds.
+
+ After configuration, you can directly use the global log component or your custom log components to record logs. AgentUniverse will automatically upload the recorded content to your sls.
\ No newline at end of file
diff --git a/docs/guidebook/en/Docker_Container_Deployment.md b/docs/guidebook/en/5_1_Docker_Container_Deployment.md
similarity index 84%
rename from docs/guidebook/en/Docker_Container_Deployment.md
rename to docs/guidebook/en/5_1_Docker_Container_Deployment.md
index be6a862f..4c3b3b4a 100644
--- a/docs/guidebook/en/Docker_Container_Deployment.md
+++ b/docs/guidebook/en/5_1_Docker_Container_Deployment.md
@@ -3,14 +3,17 @@
 AgentUniverse provides standard work environment images for containerized deployment of AgentUniverse projects. This document will explain how to deploy your own project based on the such images.
 
 ## Preparations
-1.  Build your own project according to the standard directory structure of AgentUniverse, referring to [Application_Engineering_Structure_Explanation](1_4_Application_Engineering_Structure_Explanation.md)。For ease of explanation, this document assumes the project name and project directory are `sample_standard_app`。
-2.   Get the required version of the AgentUniverse image at the xxx address.。
+1.  Build your own project according to the standard directory structure of AgentUniverse, referring to [Application_Engineering_Structure_Explanation](1_4_Application_Engineering_Structure_Explanation.md)。For ease of explanation, this document assumes the project name and project directory are `sample_standard_app`.
+2.   Get the required version of the AgentUniverse image.
+```shell
+docker pull registry.cn-hangzhou.aliyuncs.com/agent_universe/agent_universe:0.0.5_centos8_beta
+```
 
 
 ## Method 1: Mount the host path
 You can mount your project to a path inside the container by mounting the host directory, with the reference command as follows:
 ```shell
-docker run -d -p 8888:8888 -v ./sample_standard_app/:/usr/local/etc/workspace/project agentuniverse-centos8:0.0.4
+docker run -d -p 8888:8888 -v ./sample_standard_app/:/usr/local/etc/workspace/project registry.cn-hangzhou.aliyuncs.com/agent_universe/agent_universe:0.0.5_centos8_beta
 ```
 The`-p 8888:8888`represents the port mapping for the Web Server. The first 8888 indicates that the web server inside the container is started on port 8888, and the latter indicates that it is mapped to port 8888 on the host machine. Adjust it according to the actual startup conditions of the application as needed.  
 `-v {local_dir}:/usr/local/etc/workspace/project`indicates that the `local_dir` directory on the host is mounted to the `/usr/local/etc/workspace/project`within the container. The directory path inside the container is a fixed value and cannot be modified.
@@ -31,7 +34,7 @@ If you need multiple containers to mount the same directory, it's advised to pay
 ## Method 2: Pull the project from Github
 The image already has the git command installed. You can modify the image's entrypoint to git clone your project and then copy the entire project to a specified path. For example:
 ```shell
-docker run -d -p 8888:8888 --entrypoint=/bin/bash agentuniverse-centos8:0.0.4 -c "git clone {repo_addr}; mv {project_dir} /usr/local/etc/workspace/project; /bin/bash --login /usr/local/etc/workspace/shell/start.sh"
+docker run -d -p 8888:8888 --entrypoint=/bin/bash registry.cn-hangzhou.aliyuncs.com/agent_universe/agent_universe:0.0.5_centos8_beta -c "git clone {repo_addr}; mv {project_dir} /usr/local/etc/workspace/project; /bin/bash --login /usr/local/etc/workspace/shell/start.sh"
 ````
 Where `repo_addr` is the address of your git project，and `project_dir` is the project directory, for example，if `sample_standard_app` is in the `project`directory within your git project, then`project_dir` would be `project/sample_standard_app`。
 ## Result Verification
diff --git "a/docs/guidebook/zh/0_\347\233\256\345\275\225.md" "b/docs/guidebook/zh/0_\347\233\256\345\275\225.md"
index 33523c3c..0a32593d 100644
--- "a/docs/guidebook/zh/0_\347\233\256\345\275\225.md"
+++ "b/docs/guidebook/zh/0_\347\233\256\345\275\225.md"
@@ -14,11 +14,40 @@
 
 **2.原理介绍**
 
+* 2.1 框架原理
+* 2.2 [领域组件](2_2_领域组件原理.md)
+  * 2.2.1 智能体(Agent)
+  * 2.2.2 模型(LLM)
+  * 2.2.3 工具(Tool)
+  * 2.2.4 知识(Knowledge)
+  * 2.2.5 记忆(Memory)
+  * 2.2.6 规划(Planner)
+* 2.3 技术组件
+* 2.4 其他
+  * 2.4.1 服务化
+  * 2.4.2 prompt管理
+  * 2.4.3 多轮会话
+  * 2.4.4 日志体系
+  * 2.4.5 数据采集
+
 **3.组件参考手册**
+* 3.1 领域组件
+  * 3.1.1 智能体(Agent)
+  * 3.1.2 模型(LLM)
+  * 3.1.3 工具(Tool)
+  * 3.1.4 知识(Knowledge)
+  * 3.1.5 记忆(Memory)
+  * 3.1.6 规划(Planner)
+* 3.2 技术组件
+  * 3.2.1 RPC
+  * 3.2.2 存储 (store)
+  * 3.2.3 消息(Msg)
 
 **[4.API参考手册](4_1_API参考.md)**
 
 **5.最佳实践**
+* 5.1 运维部署
+  * 5.1.1 docker容器化方案
 
 **6.系列文章**
 
diff --git "a/docs/guidebook/zh/1_3_\345\277\253\351\200\237\345\274\200\345\247\213.md" "b/docs/guidebook/zh/1_3_\345\277\253\351\200\237\345\274\200\345\247\213.md"
index c77191c0..5635c0eb 100644
--- "a/docs/guidebook/zh/1_3_\345\277\253\351\200\237\345\274\200\345\247\213.md"
+++ "b/docs/guidebook/zh/1_3_\345\277\253\351\200\237\345\274\200\345\247\213.md"
@@ -194,11 +194,12 @@ metadata:
 在`xx_service.yaml`中，我们定义了一个`demo_service`的配置。`name`字段定义了服务的名称，`description`字段定义了服务的描述，`agent`字段定义该服务由哪个agent提供。
 
 ### 启动服务
-通过在IDE中执行app/bootstrap/server_application.py文件
+使用在IDE中`bootstrap`文件夹下的`server_application.py`文件启动,
 或在终端中输入如下命令完成服务接口的启动与监听：
 ```shell
-# under the root directory of the project
-python app/bootstrap/server_application.py
+# under the bootstrap directory of the project
+cd `your bootstrap directory path`
+python server_application.py
 ```
 
 当出现如下命令行说明监听成功，默认监听127.0.0.1地址8000端口，worker数为5，可在`config/gunicorn_config.toml`中修改配置。
diff --git "a/docs/guidebook/zh/2_2_\351\242\206\345\237\237\347\273\204\344\273\266\345\216\237\347\220\206.md" "b/docs/guidebook/zh/2_2_\351\242\206\345\237\237\347\273\204\344\273\266\345\216\237\347\220\206.md"
new file mode 100644
index 00000000..9fa81bcf
--- /dev/null
+++ "b/docs/guidebook/zh/2_2_\351\242\206\345\237\237\347\273\204\344\273\266\345\216\237\347\220\206.md"
@@ -0,0 +1,16 @@
+# 领域组件原理
+agentUniverse包含若干领域组件，他们互相组合构成了多智能体框架的基本组成部分，包括：
+* Agent
+* LLM
+* Tool
+* Knowledge
+* Memory
+* Planner
+
+agentUniverse所有的领域组件都包含统一的设计思想，他们拥有如下特性：
+* 研发面向配置化，提高组件的创建与复用效率
+* 拥有独立的管理器，提供统一且隔离的组件注册、管理机制；
+* 标准的领域定义，支持业界所有同类型组件的注入；
+* 组件可定制，所有的领域组件均开放自定义能力；
+
+本章节将具体介绍各领域组件设计原理与如何使用，请阅读本章节内的子文档。
\ No newline at end of file
diff --git "a/docs/guidebook/zh/2_3_\346\234\215\345\212\241.md" "b/docs/guidebook/zh/2_3_\346\234\215\345\212\241.md"
new file mode 100644
index 00000000..cddbc533
--- /dev/null
+++ "b/docs/guidebook/zh/2_3_\346\234\215\345\212\241.md"
@@ -0,0 +1,31 @@
+# Service
+
+AgentUniverse允许开发者使用简单模版定义的方式将开发完成的Agent注册为一个Service，能够在启动内置的Web服务器后，通过调用Web API使用对应的Agent服务。
+
+## 注册方式
+
+### 第一步：配置扫描路径
+AgentUniverse通过在应用启动时扫描配置路径的方式寻找Service的配置文件并进行自动注册，扫描的路径配置在配置文件`config.toml`中：
+```toml
+[CORE_PACKAGE]
+default = ['default_scan_path']
+service = ['service_scan_path']
+```
+AgentUniverse默认会扫描`default`或`service`中的所有路径，`service`下的路径配置优先级高于`default`。
+
+
+### 第二步：配置文件
+```yaml
+name: 'service_name'
+description: 'description of the service'
+agent: 'agent_name'
+metadata:
+  type: 'SERVICE'
+```
+- **`name`**:Service的名称，在Web API中调用服务时需要传入该名称。
+- **`description`**:对Service功能的描述。
+- **`agent`**:Agent的名称，关于Agent的具体内容请参考[Agent]()。
+- **`metadata`**:表示该配置是一个Service配置，无需改动。
+
+## 使用方式
+请参考[Web API](2_5_Web_Api.md).
\ No newline at end of file
diff --git a/docs/guidebook/zh/2_4_Web_Server.md b/docs/guidebook/zh/2_4_Web_Server.md
new file mode 100644
index 00000000..67054a75
--- /dev/null
+++ b/docs/guidebook/zh/2_4_Web_Server.md
@@ -0,0 +1,69 @@
+# Web Server
+
+AgentUniverse提供了一个基于Gunicorn+Flask的Web Server，您可以通过Web Server中预置的API调用开发完成的Agent服务。
+
+## Web Server启动
+您需要在AgentUniverse应用启动后，启动Web Server。  
+以下是一种启动的示例写法：
+```python
+from agentuniverse.agent_serve.web.web_booster import start_web_server
+from agentuniverse.base.agentuniverse import AgentUniverse
+
+AgentUniverse().start()
+start_web_server()
+```
+
+## Windows用户
+如果您正在windows上使用AgentUniverse，由于Gunicorn兼容性问题，AgentUniverse会直接运行Flask程序。您可以在`start_web_server`中修改启动端口，如：
+```python
+from agentuniverse.agent_serve.web.web_booster import start_web_server
+
+start_web_server(bind='127.0.0.1:8888')
+```
+
+## Web Server配置
+Web Server的配置按照优先度从低到高包含四个层次:`gunicorn`原生默认配置，AgentUniverse默认配置，配置文件配置和启动时配置。其中`gunicorn`的原生默认配置请参考对应版本的`gunicorn`官方文档。
+
+### AgentUniverse默认配置
+```python
+DEFAULT_GUNICORN_CONFIG = {
+    'bind': '127.0.0.1:8000',
+    'workers': 5,
+    'backlog': 2048,
+    'worker_class': 'gthread',
+    'threads': 4,
+    'timeout': 60,
+    'keepalive': 10
+}
+```
+AgentUniverse根据框架的工作特性预先进行了部分参数的配置，您可以通过下面的配置文件或者是启动Web Server时的参数进行修改。
+
+### 配置文件路径
+Web Server的配置路径会在AgentUniverse的主配置config.toml中指定。
+```toml
+[SUB_CONFIG_PATH]
+# Gunicorn config file path, an absolute path or a relative path based on the dir where the current config file is located.
+gunicorn_config_path = './gunicorn_config.toml'
+```
+如果该参数为相对路径形式，对应的父目录为主配置config.toml所在目录。
+
+### 配置文件
+```toml
+[GUNICORN_CONFIG]
+bind = '127.0.0.1:8000'
+backlog = 2048
+worker_class = 'gthread'
+threads = 4
+workers = 5
+timeout = 60
+keepalive = 10
+```
+配置文件以toml格式书写，具体的配置项不局限于上述实例中的内容，您可以参考`gunicorn`的官方文档进行更详细的配置。
+
+### 启动配置
+您也可以通过以下方式在启动Web Server时进行配置：
+```python
+from agentuniverse.agent_serve.web.web_booster import start_web_server
+
+start_web_server(bind="127.0.0.1:8002", threads=4)
+```
\ No newline at end of file
diff --git a/docs/guidebook/zh/2_5_Web_Api.md b/docs/guidebook/zh/2_5_Web_Api.md
new file mode 100644
index 00000000..4a0dea1c
--- /dev/null
+++ b/docs/guidebook/zh/2_5_Web_Api.md
@@ -0,0 +1,96 @@
+# Web API
+
+AgentUniverse的Web Server提供了数个调用Agent服务的API接口，允许开发者按自己的需求从外部调用Agent服务。
+
+为了方便说明，我们假设Web Server启动在本地的8888端口上，并注册了一个名为`demo_service`的Agent服务：
+```yaml
+name: 'demo_service'
+description: 'A demo service used for explaining.'
+agent: 'demo_agent'
+metadata:
+  type: 'SERVICE'
+```
+其中的`demo_agent`接受一个str类型的input参数,  
+并返回一个字符串:`"Your input is {input}."`
+
+## /service_run
+该POST接口以同步的方式调用Agent服务，调用会阻塞直到目标Agent服务返回结果。  
+调用示例如下:
+```shell
+curl -X POST -H "Content-Type: application/json" -d '{"service_id":"demo_service","params":{"input":"Hello!"}}' http://127.0.0.1:8888/service_run
+```
+预期收到的返回值示例如下：
+```shell
+{
+        "success": true,
+        "result": "Your input is Hello!.",
+        "message": null,
+        "request_id": "7dd7d737b6b64c3c92addf541e73e97c"
+}
+```
+- **`success`**:表示Agent调用的成功与否，取值为`true`和`false`。
+- **`message`**:当`success`值为`false`时，该值表示错误信息，成功时为`null`。
+- **`result`**:Agent调用成功时，表示执行的结果。
+- **`request_id`**:一串随机的字符串，用于一个唯一的请求。可以用于[/service_run_result]()接口，查询对应请求的结果。
+
+## /service_run_stream
+
+该POST接口类似`/service_run`，调用方式与其一致:
+```shell
+curl -X POST -H "Content-Type: application/json" -d '{"service_id":"demo_service","params":{"input":"Hello!"}}' http://127.0.0.1:8888/service_run_stream
+```
+但是Agent的返回结果会以流式的形式返回:
+```python
+response = Response(task.stream_run(), mimetype="text/event-stream")
+response.headers['X-Request-ID'] = task.request_id
+```
+`request_id`会被包含在响应头`X-Request-ID`中。
+
+## /service_run_async
+该POST接口以异步的形式调用Agent服务。调用方式如下:
+```shell
+curl -X POST -H "Content-Type: application/json" -d '{"service_id":"demo_service","params":{"input":"Hello!"}}' http://127.0.0.1:8888/service_run_async
+```
+该接口调用后会立刻返回:
+```shell
+{
+        "success": true,
+        "result": null,
+        "message": null,
+        "request_id": "7dd7d737b6b64c3c92addf541e73e97c"
+}
+```
+返回结果中仅会包含表示调用成功与否的`success`与表示本次调用的`request_id`。
+对于调用的结果，您需要使用`request_id`在[/service_run_result]()接口中进行查询。
+
+## /service_run_result
+该GET接口允许用户用request_id的状态，调用样例如下：
+```shell
+ curl 'http://127.0.0.1:8888/service_run_result?request_id=8e6f17dbe7ff4730a62b4a2914d73c74'
+```
+预期收到的返回值示例如下：
+```shell
+{
+  "message":null,
+  "request_id":"8e6f17dbe7ff4730a62b4a2914d73c74",
+  "result":{
+    "result":"Your input is Hello!.",
+    "state":"finish",
+    "steps":[]
+    },
+  "success":true}
+
+```
+其中`result`包含三个部分：`result`表示Agent服务的执行结果，`state`表示Agent服务的执行状态，`steps`表示Agent服务执行的中间过程。
+
+`state`表示的任务状态包含以下几种情况：
+```python
+@enum.unique
+class TaskStateEnum(Enum):
+    """All possible state of a web request task."""
+    INIT = "init"
+    RUNNING = "running"
+    FINISHED = "finished"
+    FAIL = "fail"
+    CANCELED = "canceled"
+```
diff --git "a/docs/guidebook/zh/2_6_\346\227\245\345\277\227\347\273\204\344\273\266.md" "b/docs/guidebook/zh/2_6_\346\227\245\345\277\227\347\273\204\344\273\266.md"
new file mode 100644
index 00000000..8cfe6fbb
--- /dev/null
+++ "b/docs/guidebook/zh/2_6_\346\227\245\345\277\227\347\273\204\344\273\266.md"
@@ -0,0 +1,76 @@
+# 日志组件
+
+AgentUniverse的日志组件基于loguru实现，提供封装好的全局日志组件和定制日志组件。本教程将首先介绍AgentUniverse中关于日志的配置文件使用方式，然后依次介绍关于全局日志组件和定制日志组件的使用方式，并在最后介绍如何对接外部的日志服务组件。
+## 日志配置
+
+### 配置文件路径
+日志文件的配置路径会在AgentUniverse的主配置config.toml中指定
+```toml
+[SUB_CONFIG_PATH]
+# Log config file path, an absolute path or a relative path based on the dir where the current config file is located.
+log_config_path = './log_config.toml'
+```
+如果该参数为相对路径形式，对应的父目录为主配置config.toml所在目录。
+如果该参数不存在，则AgentUniverse会使用默认日志配置，具体配置参考[默认配置](#默认配置)
+
+### 配置文件选项
+日志的配置文件为toml文件格式，一个示例配置如下。
+```toml
+[LOG_CONFIG]
+[LOG_CONFIG.BASIC_CONFIG]
+log_level = "INFO"
+log_path = "~/.agent_universe_log"
+log_rotation = "100 MB"
+log_retention = "7 days"
+```
+- **`log_level`**: 默认的日志级别，可取值包括"TRACE","DEBUG","INFO", "SUCCESS","WARNING","ERROR","CRITICAL"。全局日志组件的级别和该值相同。创建定制日志组件的时候如果不额外指定级别，则也默认使用该级别。
+- **`log_path`**: 日志存储路径，如果该值为空，则会创建一个{workdir}/../../logs文件夹作为日志存储路径。
+- **`log_rotation`**: 该参数接受一个时间长度(e.g., "1 week")或一个文件大小 (e.g., "100 MB")，用于表示日志文件滚动的条件。
+- **`log_retention`**: 该参数接受一个时间长度(e.g., "7 days")用于表示旧日志文件的保留时间，过期日志文件将会被删除。
+
+### 默认配置
+未在日志配置文件中指定的配置项采取以下默认配置：
+- **`log_level`**: "INFO"
+- **`log_rotation`**: "10MB"
+- **`log_retention`**: "3 days"
+
+在日志存储路径下会有两个默认日志文件`afaf_all.log`和`afaf_error.log`。其中all会记录所有高于日志配置中默认日志级别的日志，而error文件仅记录ERROR级别以上的日志。
+
+日志组件的输出格式为：
+```python
+log_format: str = ("<green>{time:YYYY-MM-DD HH:mm:ss.SSS}</green> "
+                       "| <level>{level: <8}</level> "
+                       "| {extra[context_prefix]} "
+                       "| <cyan>{name}</cyan>"
+                       ":<cyan>{function}</cyan>"
+                       ":<cyan>{line}</cyan> "
+                       "| <level>{message}</level>")
+```
+其中`{extra[context_prefix]}`默认为`default`, 当框架上下文中存在`LOG_CONTEXT`时，则会内容替换为`LOG_CONTEXT`的内容。关于更多框架上下文相关的内容，请参考[框架上下文](2_7_框架上下文.md)。
+
+## 全局日志组件
+AgentUniverse提供一个可直接使用的日志组件`logging_util.Logger`,您可以在项目中通过如下方式引入该组件：
+```python
+from agentuniverse.base.util.logging.logging_util import LOGGER
+```
+您可以用通过该对象的不同成员函数记录不同等级的日志：
+```python
+from agentuniverse.base.util.logging.logging_util import LOGGER
+
+LOGGER.info("This is an info log.")
+LOGGER.debug("This is a debug log.")
+LOGGER.warn("This is a warn log.")
+LOGGER.error("This is an error log.")
+```
+
+## 定制日志组件
+如果您想将某些日志单独输出保存，您可以使用`get_module_logger`函数创建一个自定义的日志组件:
+```python
+from agentuniverse.base.util.logging.logging_util import get_module_logger
+new_logger = get_module_logger("new_module")
+```
+由这个新组件记录的日志会被保存在日志存储路径下名为`afaf_{module_name}.log`的日志文件中，其中`{module_name}`是您使用`get_module_logger`时传入的模块名称，如上述例子中对应的文件为`afaf_new_module.log`。
+
+## 外部日志服务对接
+
+关于外部日志服务对接相关的内容您可以参考[拓展日志组件](3_1_拓展日志组件.md)。
\ No newline at end of file
diff --git "a/docs/guidebook/zh/2_7_\346\241\206\346\236\266\344\270\212\344\270\213\346\226\207.md" "b/docs/guidebook/zh/2_7_\346\241\206\346\236\266\344\270\212\344\270\213\346\226\207.md"
new file mode 100644
index 00000000..873412ae
--- /dev/null
+++ "b/docs/guidebook/zh/2_7_\346\241\206\346\236\266\344\270\212\344\270\213\346\226\207.md"
@@ -0,0 +1,37 @@
+# 框架上下文
+
+AgentUniverse提供了一个线程、协程独立的上下文管理工具，以key-value的形式存取需要在线程或是协程中分别管理的上下文变量。
+
+## 使用方式
+
+### 新建上下文变量
+方式1：
+```python
+from agentuniverse.base.context.framework_context import FrameworkContext
+
+with FrameworkContext({"context_var1": 1,
+                       "context_var2":"context_var"}):
+    pass
+```
+通过with关键字创建一个`FrameworkContext`实例，接受一个`dict`参数，AgentUniverse会在with的作用域内将入参中的所有key-value对保存至上下文管理器中，并在退出时清除。
+
+方式2：
+```python
+from agentuniverse.base.context.framework_context_manager import FrameworkContextManager
+
+FrameworkContextManager().set_context("context_var", "value")
+```
+直接通过上下文管理器`FrameworkContextManager`新建一个上下文变量，通过这种方式新建的变量会在整个线程或协程的生命周期内存在，可以通过下面的方式手动删除：
+```python
+from agentuniverse.base.context.framework_context_manager import FrameworkContextManager
+
+FrameworkContextManager().del_context("context_var")
+```
+### 使用上下文变量
+您可以通过上下文管理器`FrameworkContextManager`获取已经保存过的变量：
+```python
+from agentuniverse.base.context.framework_context_manager import FrameworkContextManager
+
+FrameworkContextManager().get_context("context_var", default_value=None)
+```
+其中`default_value`默认值为`None`，当上下文中不存在对应key值时返回`default_value`。
\ No newline at end of file
diff --git "a/docs/guidebook/zh/3_1_\346\213\223\345\261\225\346\227\245\345\277\227\347\273\204\344\273\266.md" "b/docs/guidebook/zh/3_1_\346\213\223\345\261\225\346\227\245\345\277\227\347\273\204\344\273\266.md"
new file mode 100644
index 00000000..fa1a4f6e
--- /dev/null
+++ "b/docs/guidebook/zh/3_1_\346\213\223\345\261\225\346\227\245\345\277\227\347\273\204\344\273\266.md"
@@ -0,0 +1,37 @@
+## 阿里云SLS
+如果您想使用阿里云SLS的相关功能，你需要安装log_ext相关依赖:
+```shell
+pip install agentuniverse[log_ext]
+```
+您需要在日志配置文件中进行以下配置：
+```toml
+[LOG_CONFIG.EXTEND_MODULE]
+# Whether use aliyun simple log server. If value is True, you should fill the ALIYUN_SLS_CONFIG below.
+sls_log = "True"
+
+[LOG_CONFIG.ALIYUN_SLS_CONFIG]
+# Aliyun sls endpoint.
+sls_endpoint = "mock_endpoint"
+# Your sls log project name.
+sls_project = "mock_project"
+# Your sls log store name.
+sls_log_store = "mock_log_store"
+# Aliyun sls access_key_id.
+access_key_id = "mock_key_id"
+# Aliyun sls access_key_secret.
+access_key_secret = "mock_key_secret"
+# Log queue max size, antfinagentframework uses a queue to save the logs to be sent, they will be sent periodically.
+sls_log_queue_max_size = 1000
+# Interval of sending logs to aliyun sls.
+sls_log_send_interval = 3.0
+```
+- **`sls_log`**: 当您需要使用sls的时候该值必须为True
+- **`sls_endpoint`**:阿里云sls的endpoint地址
+- **`sls_project`**:阿里云sls的project
+- **`sls_log_store`**:阿里云sls的log_store
+- **`access_key_id`**:阿里云sls的ak
+- **`access_key_secret`**:阿里云sls的sk
+- **`sls_log_queue_max_size`**:AgentUniverse采用定时批量上送日志的形式，这个参数表示每次上送间隔中能缓存的最大日志条数。
+- **`sls_log_send_interval`**:上送日志到sls的间隔，单位为秒
+
+在配置完成后，您可以直接使用全局日志组件或是定制日志组件记录日志，AgentUniverse会自动将记录的内容上送至您的sls。
\ No newline at end of file
diff --git "a/docs/guidebook/zh/Docker\345\256\271\345\231\250\345\214\226\351\203\250\347\275\262.md" "b/docs/guidebook/zh/5_1_Docker\345\256\271\345\231\250\345\214\226\351\203\250\347\275\262.md"
similarity index 51%
rename from "docs/guidebook/zh/Docker\345\256\271\345\231\250\345\214\226\351\203\250\347\275\262.md"
rename to "docs/guidebook/zh/5_1_Docker\345\256\271\345\231\250\345\214\226\351\203\250\347\275\262.md"
index 766fd1e9..bcbbf782 100644
--- "a/docs/guidebook/zh/Docker\345\256\271\345\231\250\345\214\226\351\203\250\347\275\262.md"
+++ "b/docs/guidebook/zh/5_1_Docker\345\256\271\345\231\250\345\214\226\351\203\250\347\275\262.md"
@@ -4,34 +4,38 @@ AgentUniverse提供标准的工作环境镜像用于容器化部署AgentUniverse
 
 ## 准备工作
 1.  按照AgentUniverse的标准结构目录搭建自己的项目，具体结构参考[应用工程结构及说明](1_4_应用工程结构及说明.md)。为方便说明，在本文档中假设项目名称和工程目录为`sample_standard_app`。
-2.  获取所需版本的镜像：您可以在xxx地址获取所需版本的AgentUniverse镜像。
+2.  获取所需版本的镜像:
+```shell
+docker pull registry.cn-hangzhou.aliyuncs.com/agent_universe/agent_universe:0.0.5_centos8_beta
+```
 
 
 ## 方法一：挂载宿主机路径
 您可以通过将宿主机目录挂载您的项目至容器内路径，参考命令如下:
 ```shell
-docker run -d -p 8888:8888 -v ./sample_standard_app/:/usr/local/etc/workspace/project agentuniverse-centos8:0.0.4
+docker run -d -p 8888:8888 -e OPENAI_API_KEY=XXX -v ./sample_standard_app/:/usr/local/etc/workspace/project registry.cn-hangzhou.aliyuncs.com/agent_universe/agent_universe:0.0.5_centos8_beta
 ```
-其中`-p 8888:8888`为Web Server的端口映射，前面的8888表示容器内的webserver启动在8888端口，后者表示映射到宿主机的8888端口，可自行根据实际应用的启动情况调整。  
+其中`-p 8888:8888`为Web Server的端口映射，前面的8888表示容器内的webserver启动在8888端口，后者表示映射到宿主机的8888端口，可自行根据实际应用的启动情况调整。-e OPENAI_API_KEY=XXX可以添加容器内的环境变量。  
 `-v {local_dir}:/usr/local/etc/workspace/project`表示把本地local_dir目录挂载至容器内的`/usr/local/etc/workspace/project`目录，容器内目录为固定值，不可修改。
 
-### 注意事项：
-如果您需要多容器挂载同一目录，使用该方法建议注意以下几点：
-1. 在config.toml中指定一个非挂载路径`/usr/local/etc/workspace/project`下的sqlite数据库文件地址，如容器内的`/usr/local/etc`下，例如
+### 使用多个容器挂载相同目录时，有以下几点建议：
+由于多个容器在相同的挂载目录进行文件的读写，有几处设置可以优化并发读写的冲突：
+1. 当您使用本地Sqlite库时，sqlite的本地数据库文件默认保存在项目主目录下，因此所有容器会读写同一个数据库文件，可能引发并发问题。建议在config.toml中指定一个非挂载路径 `/usr/local/etc/workspace/project`下的sqlite数据库文件地址，如容器内的`/usr/local/etc`下，例如
     ```toml
     mysql_uri = 'sqlite:////usr/local/etc/agent_universe.db'
     ```
-    可以减 少SQLite并发的问题（SQLite对于并发的支持不是很好）。或者也可以直接使用MySQL，这样并发性能也会更好。
-2. 在log_config.toml中指定一个非挂载路径下的目录，如
+    或者也可以使用mysql，避免在本地进行数据库文件的读写。
+2. 日志文件输出的默认路径是在项目工程的主目录，也就是挂载目录中，因此推荐在log_config.toml中指定一个非挂载路径下的目录，如
     ```toml
     log_path = "/usr/local/etc/au_log"
     ```
-    避免所有容器日志打印在同一个文件中导致难以阅读。
+    这样可以避免所有容器日志打印在同一个文件中导致难以阅读。
+3. 上述命令的端口映射部分`8888:8888`需要将后面的8888修改为不同端口，否则会发生端口冲突  
 
 ## 方法二：从Github拉取项目
 镜像中已安装git命令，您可以通过修改镜像的entrypoint，git clone您的项目后将整个工程复制到指定路径，示例命令：
 ```shell
-docker run -d -p 8888:8888 --entrypoint=/bin/bash agentuniverse-centos8:0.0.4 -c "git clone {repo_addr}; mv {project_dir} /usr/local/etc/workspace/project; /bin/bash --login /usr/local/etc/workspace/shell/start.sh"
+docker run -d -p 8888:8888 --entrypoint=/bin/bash registry.cn-hangzhou.aliyuncs.com/agent_universe/agent_universe:0.0.5_centos8_beta -c "git clone {repo_addr}; mv {project_dir} /usr/local/etc/workspace/project; /bin/bash --login /usr/local/etc/workspace/shell/start.sh"
 ````
 
 其中`repo_addr`是你的git项目地址，`project_dir`是工程路径，比如`sample_standard_app`在你git项目下的`project`目录，那么`project_dir`就是`project/sample_standard_app`。
diff --git a/pyproject.toml b/pyproject.toml
index 161be8ef..99b63731 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,9 +1,23 @@
 [tool.poetry]
 name = "agentUniverse"
-version = "0.0.4"
+version = "0.0.6_beta"
 description = "agentUniverse is a framework for developing applications powered by multi-agent base on large language model."
-authors = ["AntGroup <AntGroup>"]
-readme = "README.md"
+
+authors = ["AntGroup <jerry.zzw@antgroup.com>"]
+repository = "https://gitee.com/agentUniverse/agentUniverse"
+readme = "README_PYPI.md"
+
+packages = [
+    { include = "agentuniverse" },
+    { include = "agentuniverse_connector" },
+    { include = "agentuniverse_extension" },
+]
+include = ["*.yaml"]
+classifiers = [
+    "Programming Language :: Python :: 3.10",
+    "License :: OSI Approved :: Apache Software License",
+    "Operating System :: OS Independent",
+]
 
 [tool.poetry.dependencies]
 python = "^3.10"
diff --git a/requirements.txt b/requirements.txt
deleted file mode 100644
index 9c5f642b..00000000
--- a/requirements.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-requests>=2.31.0
-cffi>=1.15.1
-flask>=2.2
-werkzeug>=2.2.2
-langchain>=0.0.352
-langchain-core>=0.1.3
-openai>=1.13.3
-tiktoken>=0.5.2
-loguru>=0.7.2
-flask_cors>=4.0.0
-SQLAlchemy>=2.0.25
-pydantic>=2.6.4
-gunicorn>=21.2.0
-chromadb>=0.4.24
-sphinx>=7.2.6
-sphinx-rtd-theme>=2.0.0
-aliyun-log-python-sdk>=0.8.8
-googleapis-common-protos>=1.63.0
-myst-parser>=2.0.0
-pdfminer.six
\ No newline at end of file
diff --git a/sample_standard_app/app/core/agent/peer_agent_case/demo_executing_agent.yaml b/sample_standard_app/app/core/agent/peer_agent_case/demo_executing_agent.yaml
index 46185a5f..3a2fdb6f 100644
--- a/sample_standard_app/app/core/agent/peer_agent_case/demo_executing_agent.yaml
+++ b/sample_standard_app/app/core/agent/peer_agent_case/demo_executing_agent.yaml
@@ -2,31 +2,7 @@ info:
   name: 'demo_executing_agent'
   description: 'demo executing agent'
 profile:
-  prompt_version: executing_planner.default_cn
-  instruction: |
-    结合提供的背景信息和你所拥有的知识回答用户问题，确保回答详细、全面并包含足够的数据信息。针对用户的问题，进行深入分析并提供详尽的解答。
-    --------------------------------------------------------------
-    需要遵守下面的规则：
-    1.去除重复的信息。
-    2.去除对回答问题没有帮助的信息。
-    3.去除错误的信息。
-    4.详尽回答问题，重点突出，不过多花哨词藻。
-    5.不在多处讲到同一个细节点，一个点只出现一次。
-    6.尽量多的使用数值类信息。
-    7.需要高度注意信息的时效性
-    8.不可以出现XXX、ABC等不明确的词语。
-    
-    之前的对话:
-    {chat_history}
-    
-    背景信息是:
-    {background}
-    
-    开始!
-    我的问题是: {input}
-    
-    --------------------------------------------------------------
-    必须使用中文进行详细的回答。你需要聚焦在我的问题上，不要延伸这个问题，让我们一步一步来。
+  prompt_version: demo_executing_agent.cn
   llm_model:
     name: 'demo_llm'
     model_name: 'gpt-4-turbo'
@@ -43,5 +19,5 @@ action:
     - 'google_search_tool'
 metadata:
   type: 'AGENT'
-  module: 'agentuniverse.agent.default.executing_agent'
+  module: 'agentuniverse.agent.default.executing_agent.executing_agent'
   class: 'ExecutingAgent'
\ No newline at end of file
diff --git a/sample_standard_app/app/core/agent/peer_agent_case/demo_expressing_agent.yaml b/sample_standard_app/app/core/agent/peer_agent_case/demo_expressing_agent.yaml
index 701292c8..c2fd4f11 100644
--- a/sample_standard_app/app/core/agent/peer_agent_case/demo_expressing_agent.yaml
+++ b/sample_standard_app/app/core/agent/peer_agent_case/demo_expressing_agent.yaml
@@ -2,25 +2,7 @@ info:
   name: 'demo_expressing_agent'
   description: 'demo expressing agent'
 profile:
-  prompt_version: expressing_planner.default_cn
-  target: 你的任务是根据背景信息提供的q&a信息结合你自身的知识，对用户提出的具体问题，生成一个完整的结构化问题答案。
-  instruction: |
-    回答问题需要遵守下面的规则：
-    - 理解和分析背景信息中的q&a信息，结合你自身的知识，确保提供完整、结构化的答案，答案准确、清晰、易于理解。
-    - 回答问题内容详细，同时避免重复语句、需要高度注意信息的时效性。
-    - 结构化答案生成：回答分为两大段，必须是总-分结构。
-    - 第一大段总结陈述，这里需要提炼要点，做到重点突出，专业、有结构性、通顺流畅的阐述总论点，直接了当回答问题。
-    - 第二大段详细的论点阐述。基于背景信息中的q&a信息，结合你自身的知识，展开详细论述，表达的内容语义连贯。可以使用知识中的数值和数据，作为分论点的论据支撑，必要时通过空行提升阅读体验。
-    - 不做对问题没有帮助的回答、不可以出现XXX、ABC等不明确的词语。
-    - 整体回答结果没有重复信息，必要时可以通过空行提升阅读体验。
-    
-    背景信息是:
-    {background}
-    
-    开始!
-    需要回答的问题是: {input}
-    --------------------------------------------------------------
-    请根据规则要求做出回答。
+  prompt_version: demo_expressing_agent.cn
   llm_model:
     name: demo_llm
     model_name: gpt-4-turbo
@@ -34,5 +16,5 @@ memory:
   name: ''
 metadata:
   type: 'AGENT'
-  module: 'agentuniverse.agent.default.expressing_agent'
+  module: 'agentuniverse.agent.default.expressing_agent.expressing_agent'
   class: 'ExpressingAgent'
\ No newline at end of file
diff --git a/sample_standard_app/app/core/agent/peer_agent_case/demo_peer_agent.yaml b/sample_standard_app/app/core/agent/peer_agent_case/demo_peer_agent.yaml
index 71c94677..194e9e38 100644
--- a/sample_standard_app/app/core/agent/peer_agent_case/demo_peer_agent.yaml
+++ b/sample_standard_app/app/core/agent/peer_agent_case/demo_peer_agent.yaml
@@ -12,5 +12,5 @@ plan:
     reviewing: 'demo_reviewing_agent'
 metadata:
   type: 'AGENT'
-  module: 'agentuniverse.agent.default.peer_agent'
+  module: 'agentuniverse.agent.default.peer_agent.peer_agent'
   class: 'PeerAgent'
\ No newline at end of file
diff --git a/sample_standard_app/app/core/agent/peer_agent_case/demo_planning_agent.yaml b/sample_standard_app/app/core/agent/peer_agent_case/demo_planning_agent.yaml
index 86446dd2..365e7065 100644
--- a/sample_standard_app/app/core/agent/peer_agent_case/demo_planning_agent.yaml
+++ b/sample_standard_app/app/core/agent/peer_agent_case/demo_planning_agent.yaml
@@ -2,40 +2,15 @@ info:
   name: 'demo_planning_agent'
   description: 'demo planning agent'
 profile:
-  prompt_version: planning_planner.default_cn
-  target: |
-    你的目标是针对用户提出的问题，进行拆解并生成3-5个子问题。
-  instruction: |
-    根据需要回答的问题，给出一个逻辑递进的思考链路，帮助用户逐渐掌握知识并最终回答问题。
-    思考链路以子问题的形式体现，每个子问题都是一个完整的句子，能够独立通过比如google搜索信息并做出解答。
-    
-    要求如下:
-    1. 思考链路必须严格遵循需要回答的问题，不可以延伸问题，也不可以直接回答问题。
-    2. 这个思考链路的每一步必须是简单、单一的。
-    3. 每一步的问题必须是有答案的，不能是开放性的问题。
-    4. 每一步的问题必须是完整的句子，不能有任何歧义。
-    5. 子问题不要出现英文标点符号或中文标点符号
-    
-    开始!
-    注意：生成的子问题避免使用模糊的主语，比如拆解后的子问题为"这份报告有哪些要点？"，根本不清楚这份报告到底是什么。每个子问题应包含明确的主体和客体信息，以便通过搜索引擎搜索出关键信息并作出回答。
-    
-    输出必须是按照以下格式化的Json代码片段，thought字段代表拆解问题的思考过程，framework字段代表拆解后的子问题列表。
-    {{
-        "thought": string,
-        "framework": list
-    }}
-    
-    必须使用中文回答用户提出的问题。
-    
-    需要回答的问题是: {input}
+  prompt_version: demo_planning_agent.cn
   llm_model:
     name: 'demo_llm'
-    model_name: 'gpt-4-turbo'
+    model_name: 'gpt-4'
     temperature: 0.5
 plan:
   planner:
     name: 'planning_planner'
 metadata:
   type: 'AGENT'
-  module: 'agentuniverse.agent.default.planning_agent'
+  module: 'agentuniverse.agent.default.planning_agent.planning_agent'
   class: 'PlanningAgent'
\ No newline at end of file
diff --git a/sample_standard_app/app/core/agent/peer_agent_case/demo_reviewing_agent.yaml b/sample_standard_app/app/core/agent/peer_agent_case/demo_reviewing_agent.yaml
index 0daff7a7..56f50ef6 100644
--- a/sample_standard_app/app/core/agent/peer_agent_case/demo_reviewing_agent.yaml
+++ b/sample_standard_app/app/core/agent/peer_agent_case/demo_reviewing_agent.yaml
@@ -11,5 +11,5 @@ plan:
     name: 'reviewing_planner'
 metadata:
   type: 'AGENT'
-  module: 'agentuniverse.agent.default.reviewing_agent'
+  module: 'agentuniverse.agent.default.reviewing_agent.reviewing_agent'
   class: 'ReviewingAgent'
\ No newline at end of file
diff --git a/sample_standard_app/app/core/agent/rag_agent_case/demo_rag_agent.yaml b/sample_standard_app/app/core/agent/rag_agent_case/demo_rag_agent.yaml
index 64b332ea..bb8be0f4 100644
--- a/sample_standard_app/app/core/agent/rag_agent_case/demo_rag_agent.yaml
+++ b/sample_standard_app/app/core/agent/rag_agent_case/demo_rag_agent.yaml
@@ -2,15 +2,17 @@ info:
   name: 'demo_rag_agent'
   description: 'demo rag agent'
 profile:
-  prompt_version: 'rag_planner.default_cn'
+  introduction: 你是一位精通信息分析的ai助手。
+  target: 你的目标是判断问题对应的答案是否提供了有价值的信息，并对问题的答案做出建议和评价。
   instruction: |
     你需要遵守的规则是:
     1. 必须使用中文结合查询的背景信息结合你所拥有的知识回答用户提出的问题。
-    2. 不采用背景信息中的错误信息。
-    3. 要考虑答案和问题的相关性，不做对问题没有帮助的回答。
-    4. 详尽回答问题，重点突出，不过多花哨词藻。
-    5. 不说模糊的推测。
-    6. 尽量多的使用数值类信息。
+    2. 结构化答案生成，必要时通过空行提升阅读体验。
+    3. 不采用背景信息中的错误信息。
+    4. 要考虑答案和问题的相关性，不做对问题没有帮助的回答。
+    5. 详尽回答问题，重点突出，不过多花哨词藻。
+    6. 不说模糊的推测。
+    7. 尽量多的使用数值类信息。
 
     背景信息是:
     {background}
diff --git a/sample_standard_app/app/core/prompt/__init__.py b/sample_standard_app/app/core/prompt/__init__.py
new file mode 100644
index 00000000..ebc407e0
--- /dev/null
+++ b/sample_standard_app/app/core/prompt/__init__.py
@@ -0,0 +1,7 @@
+# !/usr/bin/env python3
+# -*- coding:utf-8 -*-
+
+# @Time    : 2024/5/7 20:04
+# @Author  : wangchongshi
+# @Email   : wangchongshi.wcs@antgroup.com
+# @FileName: __init__.py.py
diff --git a/sample_standard_app/app/core/prompt/executing_agent_cn.yaml b/sample_standard_app/app/core/prompt/executing_agent_cn.yaml
new file mode 100644
index 00000000..26babe3e
--- /dev/null
+++ b/sample_standard_app/app/core/prompt/executing_agent_cn.yaml
@@ -0,0 +1,31 @@
+introduction: 你是一位精通信息分析的ai助手。
+target: 你的目标是根据用户提供的问题，对查找到的知识进行整合、修正，用来回答用户问题。
+instruction: |
+    结合提供的背景信息和你所拥有的知识回答用户问题，确保回答全面并包含足够的数据信息。针对用户的问题，进行深入分析并提供详尽的解答。
+    --------------------------------------------------------------
+    需要遵守下面的规则：
+    1.去除重复的信息。
+    2.去除对回答问题没有帮助的信息。
+    3.去除错误的信息。
+    4.简要回答问题，重点突出，不过多花哨词藻。
+    5.不在多处讲到同一个细节点，一个点只出现一次。
+    6.尽量多的使用数值类信息。
+    7.需要高度注意信息的时效性
+    8.不可以出现XXX、ABC等不明确的词语。
+    
+    之前的对话:
+    {chat_history}
+    
+    背景信息是:
+    {background}
+    
+    今天的日期是: {date}
+
+    开始!
+    我的问题是: {input}
+    
+    --------------------------------------------------------------
+    必须使用中文进行详细的回答。你需要聚焦在我的问题上，不要延伸这个问题，让我们一步一步来。
+metadata:
+  type: 'PROMPT'
+  version: 'demo_executing_agent.cn'
diff --git a/sample_standard_app/app/core/prompt/expressing_agent_cn.yaml b/sample_standard_app/app/core/prompt/expressing_agent_cn.yaml
new file mode 100644
index 00000000..de0e0724
--- /dev/null
+++ b/sample_standard_app/app/core/prompt/expressing_agent_cn.yaml
@@ -0,0 +1,24 @@
+introduction: 你是一个文本编辑专家，你非常擅长从繁杂的信息中提取关键信息。
+target: 你的任务是根据背景信息提供的q&a信息结合你自身的知识，对用户提出的具体问题，生成一个完整的结构化问题答案。
+instruction: |
+  回答问题需要遵守下面的规则：
+  - 理解和分析背景信息中的q&a信息，结合你自身的知识，确保提供完整、结构化的答案，答案准确、清晰、易于理解。
+  - 回答问题内容详细，同时避免重复语句、需要高度注意信息的时效性。
+  - 结构化答案生成：回答分为两大段，必须是总-分结构。
+  - 第一大段你需要做总结陈述：这里需要提炼要点，做到重点突出，专业、有结构性、通顺流畅的阐述总论点，直接了当回答问题。
+  - 第二大段你需要做详细的论点阐述：基于背景信息中的q&a信息，结合你自身的知识，展开详细论述，表达的内容语义连贯。可以使用知识中的数值和数据，作为分论点的论据支撑，必要时通过空行提升阅读体验。
+  - 不做对问题没有帮助的回答、不可以出现XXX、ABC等不明确的词语。
+  - 整体回答结果没有重复信息，必要时可以通过空行提升阅读体验。
+  
+  背景信息是:
+  {background}
+  
+  今天的日期是: {date}
+
+  开始!
+  需要回答的问题是: {input}
+  --------------------------------------------------------------
+  请根据规则要求做出回答。
+metadata:
+  type: 'PROMPT'
+  version: 'demo_expressing_agent.cn'
diff --git a/sample_standard_app/app/core/prompt/planning_agent_cn.yaml b/sample_standard_app/app/core/prompt/planning_agent_cn.yaml
new file mode 100644
index 00000000..b2560fa1
--- /dev/null
+++ b/sample_standard_app/app/core/prompt/planning_agent_cn.yaml
@@ -0,0 +1,30 @@
+introduction: 你是一位精通信息分析的ai助手。
+target: |
+  你的目标是针对用户提出的问题，进行拆解并生成2-4个子问题。
+instruction: |
+  根据需要回答的问题，给出一个逻辑递进的思考链路，帮助用户逐渐掌握知识并最终回答问题。
+  思考链路以子问题的形式体现，每个子问题都是一个完整的问题，能够独立通过比如google搜索信息并做出解答。
+  
+  要求如下:
+  1. 思考链路必须严格遵循需要回答的问题，不可以延伸问题，也不可以直接回答问题。
+  2. 每一步的问题必须是有答案的，不能是开放性的问题。
+  3. 每一步的问题必须是完整的句子，不能有任何歧义。
+  4. 子问题不要出现英文标点符号或中文标点符号
+  5. 生成的子问题避免使用模糊的主语，比如你生成的子问题为"这份报告xxxx"，根本不清楚这份报告到底是什么，每个子问题应包含明确的主体和客体信息，以便通过搜索引擎搜索出关键信息并作出回答。
+  
+  开始!
+  今天的日期是: {date}
+
+  输出必须是按照以下格式化的Json代码片段，thought字段代表拆解问题的思考过程，framework字段代表拆解后的子问题列表。
+  {{
+      "thought": string,
+      "framework": list
+  }}
+  
+  必须使用中文回答用户提出的问题。
+  
+  
+  需要回答的问题是: {input}
+metadata:
+  type: 'PROMPT'
+  version: 'demo_planning_agent.cn'
diff --git a/sample_standard_app/config/config.toml b/sample_standard_app/config/config.toml
index fe4a5eeb..ca5b7150 100644
--- a/sample_standard_app/config/config.toml
+++ b/sample_standard_app/config/config.toml
@@ -20,7 +20,7 @@ memory = ['sample_standard_app.app.core.memory']
 # Scan and register service components for all paths under this list, with priority over the default.
 service = ['sample_standard_app.app.core.service']
 # Scan and register prompt components for all paths under this list, with priority over the default.
-prompt = []
+prompt = ['sample_standard_app.app.core.prompt']
 
 [SUB_CONFIG_PATH]
 # Log config file path, an absolute path or a relative path based on the dir where the current config file is located.
diff --git a/sample_standard_app/examples/__init__.py b/sample_standard_app/examples/__init__.py
new file mode 100644
index 00000000..f6cf9e11
--- /dev/null
+++ b/sample_standard_app/examples/__init__.py
@@ -0,0 +1,7 @@
+# !/usr/bin/env python3
+# -*- coding:utf-8 -*-
+
+# @Time    : 2024/5/8 11:41
+# @Author  : wangchongshi
+# @Email   : wangchongshi.wcs@antgroup.com
+# @FileName: __init__.py.py
diff --git a/sample_standard_app/examples/peer_chat_bot.py b/sample_standard_app/examples/peer_chat_bot.py
new file mode 100644
index 00000000..ed25834a
--- /dev/null
+++ b/sample_standard_app/examples/peer_chat_bot.py
@@ -0,0 +1,25 @@
+# !/usr/bin/env python3
+# -*- coding:utf-8 -*-
+
+# @Time    : 2024/5/8 11:41
+# @Author  : wangchongshi
+# @Email   : wangchongshi.wcs@antgroup.com
+# @FileName: peer_chat_bot.py
+from agentuniverse.base.agentuniverse import AgentUniverse
+from agentuniverse.agent.agent import Agent
+from agentuniverse.agent.agent_manager import AgentManager
+
+AgentUniverse().start(config_path='../config/config.toml')
+
+
+def chat(question: str):
+    """ Peer agents example.
+
+    The peer agents in agentUniverse become a chatbot and can ask questions to get the answer.
+    """
+    instance: Agent = AgentManager().get_instance_obj('demo_peer_agent')
+    instance.run(input=question)
+
+
+if __name__ == '__main__':
+    chat("帮我分析下2023年巴菲特减持比亚迪原因")
diff --git a/sample_standard_app/examples/rag_chat_bot.py b/sample_standard_app/examples/rag_chat_bot.py
new file mode 100644
index 00000000..4b0906e4
--- /dev/null
+++ b/sample_standard_app/examples/rag_chat_bot.py
@@ -0,0 +1,30 @@
+# !/usr/bin/env python3
+# -*- coding:utf-8 -*-
+
+# @Time    : 2024/5/8 11:44
+# @Author  : wangchongshi
+# @Email   : wangchongshi.wcs@antgroup.com
+# @FileName: rag_chat_bot.py
+from agentuniverse.agent.output_object import OutputObject
+from agentuniverse.agent.agent import Agent
+from agentuniverse.agent.agent_manager import AgentManager
+from agentuniverse.base.agentuniverse import AgentUniverse
+
+AgentUniverse().start(config_path='../config/config.toml')
+
+
+def chat(question: str):
+    """ Rag agent example.
+
+    The rag agent in agentUniverse becomes a chatbot and can ask questions to get the answer.
+    """
+
+    instance: Agent = AgentManager().get_instance_obj('demo_rag_agent')
+    output_object: OutputObject = instance.run(input=question)
+    res_info = f"\nRag chat bot execution result is :\n"
+    res_info += output_object.get_data('output')
+    print(res_info)
+
+
+if __name__ == '__main__':
+    chat("帮我分析下2023年巴菲特减持比亚迪原因")
diff --git a/setup.py b/setup.py
deleted file mode 100644
index 611d37f9..00000000
--- a/setup.py
+++ /dev/null
@@ -1,43 +0,0 @@
-# !/usr/bin/env python3
-# -*- coding:utf-8 -*-
-
-# @Time    : 2024/4/8 16:17
-# @Author  : jerry.zzw 
-# @Email   : jerry.zzw@antgroup.com
-# @FileName: setup.py
-
-import setuptools
-
-with open("README_PYPI.md", "r") as fh:
-    long_description = fh.read()
-
-
-def read_requirements():
-    with open('requirements.txt', 'r') as req:
-        content = req.read()
-        requirements = content.split('\n')
-
-    return requirements
-
-
-setuptools.setup(
-    name="agentUniverse",
-    version="0.0.4",
-    author="AntGroup",
-    author_email="jerry.zzw@antgroup.com",
-    description="agentUniverse is a framework for developing applications powered "
-                "by multi-agent base on large language model.",
-    long_description=long_description,
-    long_description_content_type="text/markdown",
-    url="https://gitee.com/agentUniverse/agentUniverse",
-    packages=setuptools.find_packages(),
-    package_data={
-            '': ['*.yaml'],
-        },
-    install_requires=read_requirements(),
-    classifiers=[
-        'Programming Language :: Python :: 3.10',
-        "License :: OSI Approved :: Apache Software License",
-        "Operating System :: OS Independent",
-    ],
-)


Test patch:
diff --git a/sample_standard_app/app/test/test_peer_agent.py b/sample_standard_app/app/test/test_peer_agent.py
index 2d9e2923..152c9d67 100644
--- a/sample_standard_app/app/test/test_peer_agent.py
+++ b/sample_standard_app/app/test/test_peer_agent.py
@@ -24,7 +24,7 @@ def test_peer_agent(self):
         """
 
         instance: Agent = AgentManager().get_instance_obj('demo_peer_agent')
-        instance.run(input='请帮我分析下2023年巴菲特减持比亚迪的原因')
+        instance.run(input='分析下巴菲特减持比亚迪的原因')
 
 
 if __name__ == '__main__':
diff --git a/sample_standard_app/app/test/test_rag_agent.py b/sample_standard_app/app/test/test_rag_agent.py
index 217c23c0..06c3d9b8 100644
--- a/sample_standard_app/app/test/test_rag_agent.py
+++ b/sample_standard_app/app/test/test_rag_agent.py
@@ -24,7 +24,7 @@ def setUp(self) -> None:
     def test_rag_agent(self):
         """Test demo rag agent."""
         instance: Agent = AgentManager().get_instance_obj('demo_rag_agent')
-        output_object: OutputObject = instance.run(input='英伟达股票大涨原因')
+        output_object: OutputObject = instance.run(input='分析下巴菲特减持比亚迪的原因')
         res_info = f"\nRag agent execution result is :\n"
         res_info += output_object.get_data('output')
         print(res_info)
diff --git a/tests/test_agentuniverse/unit/llm/test_llm.py b/tests/test_agentuniverse/unit/llm/test_llm.py
index 970522b6..61e96c1d 100644
--- a/tests/test_agentuniverse/unit/llm/test_llm.py
+++ b/tests/test_agentuniverse/unit/llm/test_llm.py
@@ -27,7 +27,7 @@ def test_call(self) -> None:
                 "content": "hi, please introduce yourself",
             }
         ]
-        output = self.llm.call(messages=messages)
+        output = self.llm.call(messages=messages,streaming=False)
         print(output.__str__())
 
     def test_acall(self) -> None:
@@ -37,9 +37,37 @@ def test_acall(self) -> None:
                 "content": "hi, please introduce yourself",
             }
         ]
-        output = asyncio.run(self.llm.acall(messages=messages))
+        output = asyncio.run(self.llm.acall(messages=messages,streaming=False))
         print(output.__str__())
 
+    def test_call_stream(self):
+        messages = [
+            {
+                "role": "user",
+                "content": "hi, please introduce yourself",
+            }
+        ]
+        for chunk in self.llm.call(messages=messages, streaming=True):
+            print(chunk.text, end='')
+        print()
+
+    #
+    def test_acall_stream(self):
+        messages = [
+            {
+                "role": "user",
+                "content": "hi, please introduce yourself",
+            }
+        ]
+        asyncio.run(self.call_stream(messages=messages))
+
+    #
+    async def call_stream(self, messages: list):
+
+        async for chunk in await self.llm.acall(messages=messages, streaming=True):
+            print(chunk, end='')
+        print()
+
     def test_as_langchain(self):
         langchain_llm = self.llm.as_langchain()
         llm_chain = ConversationChain(llm=langchain_llm)