Repository: antgroup/agentUniverse (language: python)

Issue:
feat: release version 0.0.5



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/MANIFEST.in b/MANIFEST.in
new file mode 100644
index 00000000..74232943
--- /dev/null
+++ b/MANIFEST.in
@@ -0,0 +1,13 @@
+include CHANGELOG.md
+include CHANGELOG_zh.md
+include LICENSE
+include README.md
+include README_zh.md
+include requirements.txt
+include MANIFEST.in
+recursive-exclude docs *
+recursive-exclude sample_standard_app *
+recursive-exclude tests *
+global-exclude __pycache__
+global-exclude *.log
+global-exclude *.pyc
\ No newline at end of file
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/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/pyproject.toml b/pyproject.toml
index 161be8ef..ee8917f8 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
 [tool.poetry]
 name = "agentUniverse"
-version = "0.0.4"
+version = "0.0.5"
 description = "agentUniverse is a framework for developing applications powered by multi-agent base on large language model."
 authors = ["AntGroup <AntGroup>"]
 readme = "README.md"
diff --git a/requirements.txt b/requirements.txt
index 9c5f642b..23a67452 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -12,8 +12,6 @@ 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
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
index 611d37f9..ffe538a5 100644
--- a/setup.py
+++ b/setup.py
@@ -22,7 +22,7 @@ def read_requirements():
 
 setuptools.setup(
     name="agentUniverse",
-    version="0.0.4",
+    version="0.0.5",
     author="AntGroup",
     author_email="jerry.zzw@antgroup.com",
     description="agentUniverse is a framework for developing applications powered "
@@ -30,7 +30,7 @@ def read_requirements():
     long_description=long_description,
     long_description_content_type="text/markdown",
     url="https://gitee.com/agentUniverse/agentUniverse",
-    packages=setuptools.find_packages(),
+    packages=setuptools.find_packages(exclude=["*sample_standard_app*", "*docs*", "*tests*"]),
     package_data={
             '': ['*.yaml'],
         },


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)