Repository: antgroup/agentUniverse (language: python)

Issue:
 docs: add agent component documents



Discussion / hints:

Fix patch:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 6e414ce3..3d8ab500 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -24,6 +24,15 @@ Note - Additional remarks regarding the version.
 ***************************************************
 
 # Version Update History
+## [0.0.6] - 2024-05-15
+### Added
+- Support for the GPT-4o model, with updates to related examples.
+- Support for the RPC component gRPC, providing a standard method for service startup.
+
+### Note 
+- Provide standard Docker images and K8S deployment solutions.
+- Some code optimizations and documentation updates.
+
 ## [0.0.5] - 2024-05-08
 ### Added
 - The LLM component supports streaming calls.
diff --git a/CHANGELOG_zh.md b/CHANGELOG_zh.md
index 9c5e3a1c..8d0998a1 100644
--- a/CHANGELOG_zh.md
+++ b/CHANGELOG_zh.md
@@ -24,6 +24,16 @@ Note - 对于版本的额外说明。
 ***************************************************
 
 # 版本更新记录
+
+## [0.0.6] - 2024-05-15
+### Added
+- 支持gpt-4o模型, 并更新相关样例
+- 支持RPC组件gGpc，并提供标准服务启动方法
+
+### Note 
+- 提供标准的aU Docker镜像与K8S部署方案，详情见指导手册
+- 部分代码优化与文档更新
+
 ## [0.0.5] - 2024-05-08
 ### Added
 - LLM组件支持流式调用
diff --git a/README.md b/README.md
index e3c5326b..9b31fcd5 100644
--- a/README.md
+++ b/README.md
@@ -5,7 +5,7 @@ Language version: [English](./README.md) | [中文](./README_zh.md)
 ![](https://img.shields.io/badge/framework-agentUniverse-pink)
 ![](https://img.shields.io/badge/python-3.10%2B-blue?logo=Python)
 [![](https://img.shields.io/badge/%20license-Apache--2.0-yellow)](LICENSE)
-[![Static Badge](https://img.shields.io/badge/pypi-v0.0.4-blue?logo=pypi)](https://pypi.org/project/agentUniverse/)
+[![Static Badge](https://img.shields.io/badge/pypi-v0.0.6-blue?logo=pypi)](https://pypi.org/project/agentUniverse/)
 
 ![](docs/guidebook/_picture/logo_bar.jpg)
 ****************************************
diff --git a/README_zh.md b/README_zh.md
index 2ec569ca..84c22ab5 100644
--- a/README_zh.md
+++ b/README_zh.md
@@ -5,7 +5,7 @@
 ![](https://img.shields.io/badge/framework-agentUniverse-pink)
 ![](https://img.shields.io/badge/python-3.10%2B-blue?logo=Python)
 [![](https://img.shields.io/badge/%20license-Apache--2.0-yellow)](LICENSE)
-[![Static Badge](https://img.shields.io/badge/pypi-v0.0.4-blue?logo=pypi)](https://pypi.org/project/agentUniverse/)
+[![Static Badge](https://img.shields.io/badge/pypi-v0.0.6-blue?logo=pypi)](https://pypi.org/project/agentUniverse/)
 
 ![](docs/guidebook/_picture/logo_bar.jpg)
 ****************************************
diff --git a/agentuniverse/agent/agent.py b/agentuniverse/agent/agent.py
index 2504bafb..2f4099fc 100644
--- a/agentuniverse/agent/agent.py
+++ b/agentuniverse/agent/agent.py
@@ -44,14 +44,14 @@ def output_keys(self) -> list[str]:
         pass
 
     @abstractmethod
-    def parse_input(self, input_object: InputObject, planner_input: dict) -> dict:
-        """Planner parameter parsing.
+    def parse_input(self, input_object: InputObject, agent_input: dict) -> dict:
+        """Agent parameter parsing.
 
         Args:
-            input_object(InputObject): agent parameter object
-            planner_input(dict): Planner input
+            input_object (InputObject): input parameters passed by the user.
+            agent_input (dict): agent input preparsed by the agent.
         Returns:
-            dict: Planner parameter.
+            dict: agent input parsed from `input_object` by the user.
         """
         pass
 
@@ -74,41 +74,48 @@ def run(self, **kwargs) -> OutputObject:
         """
         self.input_check(kwargs)
         input_object = InputObject(kwargs)
-        execute_result = self.execute(input_object)
-        self.output_check(execute_result)
-        output_object = OutputObject(execute_result)
+
+        agent_input = self.pre_parse_input(input_object)
+
+        planner_result = self.execute(input_object, agent_input)
+
+        agent_result = self.parse_result(planner_result)
+
+        self.output_check(agent_result)
+        output_object = OutputObject(agent_result)
         return output_object
 
-    def execute(self, input_object: InputObject) -> dict:
+    def execute(self, input_object: InputObject, agent_input: dict) -> dict:
         """Execute agent instance.
 
         Args:
-            input_object(InputObject): agent parameter object
+            input_object (InputObject): input parameters passed by the user.
+            agent_input (dict): agent input parsed from `input_object` by the user.
+
         Returns:
-            dict: Agent result object.
+            dict: planner result generated by the planner execution.
         """
-        planner_input = self.pre_parse_input(input_object)
 
         planner_base: Planner = PlannerManager().get_instance_obj(self.agent_model.plan.get('planner').get('name'))
-        planner_result = planner_base.invoke(self.agent_model, planner_input, input_object)
-
-        parser_result = self.parse_result(planner_result)
-        return parser_result
+        planner_result = planner_base.invoke(self.agent_model, agent_input, input_object)
+        return planner_result
 
     def pre_parse_input(self, input_object) -> dict:
         """Agent execution parameter pre-parsing.
 
-        Args: input_object(InputObject): agent parameter object
+        Args:
+            input_object (InputObject): input parameters passed by the user.
         Returns:
-            dict: Planner input
+            dict: agent input preparsed by the agent.
         """
-        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
+        agent_input = dict()
+        agent_input['chat_history'] = input_object.get_data('chat_history') or ''
+        agent_input['background'] = input_object.get_data('background') or ''
+        agent_input['image_urls'] = input_object.get_data('image_urls') or []
+        agent_input['date'] = datetime.now().strftime('%Y-%m-%d')
+
+        self.parse_input(input_object, agent_input)
+        return agent_input
 
     def get_instance_code(self) -> str:
         """Return the full name of the agent."""
diff --git a/agentuniverse/agent/default/executing_agent/executing_agent.py b/agentuniverse/agent/default/executing_agent/executing_agent.py
index 6364beee..94e4143d 100644
--- a/agentuniverse/agent/default/executing_agent/executing_agent.py
+++ b/agentuniverse/agent/default/executing_agent/executing_agent.py
@@ -26,19 +26,19 @@ def output_keys(self) -> list[str]:
         """Return the output keys of the Agent."""
         return ['executing_result']
 
-    def parse_input(self, input_object: InputObject, planner_input: dict) -> dict:
-        """Planner parameter parsing.
+    def parse_input(self, input_object: InputObject, agent_input: dict) -> dict:
+        """Agent parameter parsing.
 
         Args:
-            input_object(InputObject): agent parameter object
-            planner_input(dict): Planner input
+            input_object (InputObject): input parameters passed by the user.
+            agent_input (dict): agent input preparsed by the agent.
         Returns:
-            dict: Planner input
+            dict: agent input parsed from `input_object` by the user.
         """
-        planner_input['input'] = input_object.get_data('input')
-        planner_input['framework'] = input_object.get_data('planning_result').get_data('framework')
+        agent_input['input'] = input_object.get_data('input')
+        agent_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
+        return agent_input
 
     def parse_result(self, planner_result: dict) -> dict:
         """Planner result parser.
@@ -60,24 +60,24 @@ def parse_result(self, planner_result: dict) -> dict:
 
         return {'executing_result': executing_result, 'llm_result': llm_result}
 
-    def execute(self, input_object: InputObject) -> dict:
+    def execute(self, input_object: InputObject, agent_input: dict) -> dict:
         """Execute agent instance.
 
         Args:
-            input_object(InputObject): agent parameter object
+            input_object (InputObject): input parameters passed by the user.
+            agent_input (dict): agent input parsed from `input_object` by the user.
+
         Returns:
             dict: Agent result object.
         """
-        planning_result = input_object.get_data('planning_result')
-        framework = planning_result.get_data('framework', [])
+        framework = agent_input.get('framework', [])
         futures = []
         for task in framework:
-            input_object_copy: InputObject = copy.deepcopy(input_object)
-            input_object_copy.add_data('input', task)
-            planner_input = super().pre_parse_input(input_object_copy)
+            agent_input_copy: dict = copy.deepcopy(agent_input)
+            agent_input_copy['input'] = task
             futures.append(
                 self.executor.submit(
                     PlannerManager().get_instance_obj(self.agent_model.plan.get('planner').get('name')).invoke,
-                    self.agent_model, planner_input, input_object_copy))
+                    self.agent_model, agent_input_copy, input_object))
         wait(futures, return_when=ALL_COMPLETED)
-        return self.parse_result({'futures': futures})
+        return {'futures': futures}
diff --git a/agentuniverse/agent/default/expressing_agent/expressing_agent.py b/agentuniverse/agent/default/expressing_agent/expressing_agent.py
index a41c2ab9..197aded8 100644
--- a/agentuniverse/agent/default/expressing_agent/expressing_agent.py
+++ b/agentuniverse/agent/default/expressing_agent/expressing_agent.py
@@ -20,19 +20,19 @@ def output_keys(self) -> list[str]:
         """Return the output keys of the Agent."""
         return ['output']
 
-    def parse_input(self, input_object: InputObject, planner_input: dict) -> dict:
-        """Planner parameter parsing.
+    def parse_input(self, input_object: InputObject, agent_input: dict) -> dict:
+        """Agent parameter parsing.
 
         Args:
-            input_object(InputObject): agent parameter object
-            planner_input(dict): Planner input
+            input_object (InputObject): input parameters passed by the user.
+            agent_input (dict): agent input preparsed by the agent.
         Returns:
-            dict: Planner input
+            dict: agent input parsed from `input_object` by the user.
         """
-        planner_input['input'] = input_object.get_data('input')
-        planner_input['background'] = self.build_background(input_object)
+        agent_input['input'] = input_object.get_data('input')
+        agent_input['background'] = self.build_background(input_object)
         self.agent_model.profile.setdefault('prompt_version', 'default_expressing_agent.cn')
-        return planner_input
+        return agent_input
 
     def parse_result(self, planner_result: dict) -> dict:
         """Planner result parser.
diff --git a/agentuniverse/agent/default/peer_agent/peer_agent.py b/agentuniverse/agent/default/peer_agent/peer_agent.py
index 5c003ff4..69308f89 100644
--- a/agentuniverse/agent/default/peer_agent/peer_agent.py
+++ b/agentuniverse/agent/default/peer_agent/peer_agent.py
@@ -20,17 +20,17 @@ def output_keys(self) -> list[str]:
         """Return the output keys of the Agent."""
         return ['output']
 
-    def parse_input(self, input_object: InputObject, planner_input: dict) -> dict:
-        """Planner parameter parsing.
+    def parse_input(self, input_object: InputObject, agent_input: dict) -> dict:
+        """Agent parameter parsing.
 
         Args:
-            input_object(InputObject): agent parameter object
-            planner_input(dict): Planner input
+            input_object(InputObject): input parameters passed by the user.
+            agent_input(dict): agent input preparsed by the agent.
         Returns:
-            dict: Planner input
+            dict: agent input parsed from `input_object` by the user.
         """
-        planner_input['input'] = input_object.get_data('input')
-        return planner_input
+        agent_input['input'] = input_object.get_data('input')
+        return agent_input
 
     def parse_result(self, planner_result: dict) -> dict:
         """Planner result parser.
diff --git a/agentuniverse/agent/default/planning_agent/planning_agent.py b/agentuniverse/agent/default/planning_agent/planning_agent.py
index 33ab76d7..cff17070 100644
--- a/agentuniverse/agent/default/planning_agent/planning_agent.py
+++ b/agentuniverse/agent/default/planning_agent/planning_agent.py
@@ -21,19 +21,19 @@ def output_keys(self) -> list[str]:
         """Return the output keys of the Agent."""
         return ['output']
 
-    def parse_input(self, input_object: InputObject, planner_input: dict) -> dict:
-        """Planner parameter parsing.
+    def parse_input(self, input_object: InputObject, agent_input: dict) -> dict:
+        """Agent parameter parsing.
 
         Args:
-            input_object(InputObject): agent parameter object
-            planner_input(dict): Planner input
+            input_object (InputObject): input parameters passed by the user.
+            agent_input (dict): agent input preparsed by the agent.
         Returns:
-            dict: Planner input
+            dict: agent input parsed from `input_object` by the user.
         """
-        planner_input['input'] = input_object.get_data('input')
-        planner_input['expert_framework'] = input_object.get_data('expert_framework')
+        agent_input['input'] = input_object.get_data('input')
+        agent_input['expert_framework'] = input_object.get_data('expert_framework')
         self.agent_model.profile.setdefault('prompt_version', 'default_planning_agent.cn')
-        return planner_input
+        return agent_input
 
     def parse_result(self, planner_result: dict) -> dict:
         """Planner result parser.
diff --git a/agentuniverse/agent/default/rag_agent/rag_agent.py b/agentuniverse/agent/default/rag_agent/rag_agent.py
index 75b35ec1..cba7267b 100644
--- a/agentuniverse/agent/default/rag_agent/rag_agent.py
+++ b/agentuniverse/agent/default/rag_agent/rag_agent.py
@@ -20,19 +20,18 @@ def output_keys(self) -> list[str]:
         """Return the output keys of the Agent."""
         return ['output']
 
-    def parse_input(self, input_object: InputObject, planner_input: dict) -> dict:
-        """Planner parameter parsing.
+    def parse_input(self, input_object: InputObject, agent_input: dict) -> dict:
+        """Agent parameter parsing.
 
         Args:
-            input_object(InputObject): agent parameter object
-            planner_input(dict): Planner input
+            input_object (InputObject): input parameters passed by the user.
+            agent_input (dict): agent input preparsed by the agent.
         Returns:
-            dict: Planner input
+            dict: agent input parsed from `input_object` by the user.
         """
-        input = input_object.get_data('input')
-        planner_input['input'] = input
+        agent_input['input'] = input_object.get_data('input')
         self.agent_model.profile.setdefault('prompt_version', 'default_rag_agent.cn')
-        return planner_input
+        return agent_input
 
     def parse_result(self, planner_result: dict) -> dict:
         """Planner result parser.
diff --git a/agentuniverse/agent/default/reviewing_agent/reviewing_agent.py b/agentuniverse/agent/default/reviewing_agent/reviewing_agent.py
index 24780e73..16bbef28 100644
--- a/agentuniverse/agent/default/reviewing_agent/reviewing_agent.py
+++ b/agentuniverse/agent/default/reviewing_agent/reviewing_agent.py
@@ -21,19 +21,19 @@ def output_keys(self) -> list[str]:
         """Return the output keys of the Agent."""
         return ['output']
 
-    def parse_input(self, input_object: InputObject, planner_input: dict) -> dict:
-        """Planner parameter parsing.
+    def parse_input(self, input_object: InputObject, agent_input: dict) -> dict:
+        """Agent parameter parsing.
 
         Args:
-            input_object(InputObject): agent parameter object
-            planner_input(dict): Planner input
+            input_object(InputObject): input parameters passed by the user.
+            agent_input(dict): agent input preparsed by the agent.
         Returns:
-            dict: Planner parameter.
+            dict: agent input parsed from `input_object` by the user.
         """
-        planner_input['input'] = input_object.get_data('input')
-        planner_input['expressing_result'] = input_object.get_data('expressing_result').get_data('output')
+        agent_input['input'] = input_object.get_data('input')
+        agent_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
+        return agent_input
 
     def parse_result(self, planner_result: dict) -> dict:
         """Planner result parser.
diff --git a/agentuniverse/agent/memory/message.py b/agentuniverse/agent/memory/message.py
index 334d785a..8e639c9f 100644
--- a/agentuniverse/agent/memory/message.py
+++ b/agentuniverse/agent/memory/message.py
@@ -5,10 +5,15 @@
 # @Author  : wangchongshi
 # @Email   : wangchongshi.wcs@antgroup.com
 # @FileName: message.py
-from typing import Optional
+from typing import Optional, List, Union, Dict
 
+from langchain_core.messages import HumanMessage
+from langchain_core.prompts import SystemMessagePromptTemplate, HumanMessagePromptTemplate, AIMessagePromptTemplate
+from langchain_core.prompts.chat import BaseStringMessagePromptTemplate
 from pydantic import BaseModel
 
+from agentuniverse.agent.memory.enum import ChatMessageEnum
+
 
 class Message(BaseModel):
     """The basic class for memory message.
@@ -19,4 +24,28 @@ class Message(BaseModel):
     """
 
     type: Optional[str] = None
-    content: Optional[str] = None
+    content: Union[str, List[Union[str, Dict]]] = None
+
+    def as_langchain(self):
+        """Convert the AgentUniverse(AU) message class to the langchain message class."""
+        if self.type == ChatMessageEnum.SYSTEM.value:
+            return SystemMessagePromptTemplate.from_template(self.content)
+        elif self.type == ChatMessageEnum.HUMAN.value:
+            if isinstance(self.content, str):
+                return HumanMessagePromptTemplate.from_template(self.content)
+            elif isinstance(self.content, list):
+                return HumanMessage(content=self.content)
+        elif self.type == ChatMessageEnum.AI.value:
+            return AIMessagePromptTemplate.from_template(self.content)
+        else:
+            return BaseStringMessagePromptTemplate.from_template(self.content)
+
+    @staticmethod
+    def as_langchain_list(message_list: List['Message']):
+        """Convert AgentUniverse(AU) message list to langchain message list """
+        langchain_message_list = []
+        if message_list is None:
+            return langchain_message_list
+        for message in message_list:
+            langchain_message_list.append(message.as_langchain())
+        return langchain_message_list
diff --git a/agentuniverse/agent/plan/planner/executing_planner/executing_planner.py b/agentuniverse/agent/plan/planner/executing_planner/executing_planner.py
index e8190ce0..6a2bb310 100644
--- a/agentuniverse/agent/plan/planner/executing_planner/executing_planner.py
+++ b/agentuniverse/agent/plan/planner/executing_planner/executing_planner.py
@@ -29,7 +29,7 @@ def invoke(self, agent_model: AgentModel, planner_input: dict, input_object: Inp
         Args:
             agent_model (AgentModel): Agent model object.
             planner_input (dict): Planner input object.
-            input_object (InputObject): Agent input object.
+            input_object (InputObject): The input parameters passed by the user.
         Returns:
             dict: The planner result.
         """
diff --git a/agentuniverse/agent/plan/planner/expressing_planner/expressing_planner.py b/agentuniverse/agent/plan/planner/expressing_planner/expressing_planner.py
index d3e8a614..98ba29c2 100644
--- a/agentuniverse/agent/plan/planner/expressing_planner/expressing_planner.py
+++ b/agentuniverse/agent/plan/planner/expressing_planner/expressing_planner.py
@@ -29,7 +29,7 @@ def invoke(self, agent_model: AgentModel, planner_input: dict, input_object: Inp
         Args:
             agent_model (AgentModel): Agent model object.
             planner_input (dict): Planner input object.
-            input_object (InputObject): Agent input object.
+            input_object (InputObject): The input parameters passed by the user.
         Returns:
             dict: The planner result.
         """
diff --git a/agentuniverse/agent/plan/planner/peer_planner/peer_planner.py b/agentuniverse/agent/plan/planner/peer_planner/peer_planner.py
index b00e7eac..e3614e7c 100644
--- a/agentuniverse/agent/plan/planner/peer_planner/peer_planner.py
+++ b/agentuniverse/agent/plan/planner/peer_planner/peer_planner.py
@@ -36,7 +36,7 @@ def invoke(self, agent_model: AgentModel, planner_input: dict, input_object: Inp
         Args:
             agent_model (AgentModel): Agent model object.
             planner_input (dict): Planner input object.
-            input_object (InputObject): Agent input object.
+            input_object (InputObject): The input parameters passed by the user.
         Returns:
             dict: The planner result.
         """
diff --git a/agentuniverse/agent/plan/planner/planner.py b/agentuniverse/agent/plan/planner/planner.py
index 9bf1aa0f..83e8107d 100644
--- a/agentuniverse/agent/plan/planner/planner.py
+++ b/agentuniverse/agent/plan/planner/planner.py
@@ -54,7 +54,7 @@ def invoke(self, agent_model: AgentModel, planner_input: dict,
         Args:
             agent_model (AgentModel): Agent model object.
             planner_input (dict): Planner input object.
-            input_object (InputObject): Agent input object.
+            input_object (InputObject): The input parameters passed by the user.
         Returns:
             dict: The planner result.
         """
@@ -124,7 +124,7 @@ def handle_all_actions(self, agent_model: AgentModel, planner_input: dict, input
 
         planner_input['background'] = planner_input['background'] or '' + "\n".join(action_result)
 
-    def handle_prompt(self, agent_model: AgentModel, planner_input: dict) -> Prompt:
+    def handle_prompt(self, agent_model: AgentModel, planner_input: dict):
         """Prompt module processing.
 
         Args:
diff --git a/agentuniverse/agent/plan/planner/planning_planner/planning_planner.py b/agentuniverse/agent/plan/planner/planning_planner/planning_planner.py
index 62966df2..96d7bdad 100644
--- a/agentuniverse/agent/plan/planner/planning_planner/planning_planner.py
+++ b/agentuniverse/agent/plan/planner/planning_planner/planning_planner.py
@@ -30,7 +30,7 @@ def invoke(self, agent_model: AgentModel, planner_input: dict,
         Args:
             agent_model (AgentModel): Agent model object.
             planner_input (dict): Planner input object.
-            input_object (InputObject): Agent input object.
+            input_object (InputObject): The input parameters passed by the user.
         Returns:
             dict: The planner result.
         """
diff --git a/agentuniverse/agent/plan/planner/rag_planner/rag_planner.py b/agentuniverse/agent/plan/planner/rag_planner/rag_planner.py
index d5a58043..99a3b3f2 100644
--- a/agentuniverse/agent/plan/planner/rag_planner/rag_planner.py
+++ b/agentuniverse/agent/plan/planner/rag_planner/rag_planner.py
@@ -15,6 +15,7 @@
 from agentuniverse.agent.plan.planner.planner import Planner
 from agentuniverse.base.util.prompt_util import process_llm_token
 from agentuniverse.llm.llm import LLM
+from agentuniverse.prompt.chat_prompt import ChatPrompt
 from agentuniverse.prompt.prompt import Prompt
 from agentuniverse.prompt.prompt_manager import PromptManager
 from agentuniverse.prompt.prompt_model import AgentPromptModel
@@ -30,7 +31,7 @@ def invoke(self, agent_model: AgentModel, planner_input: dict,
         Args:
             agent_model (AgentModel): Agent model object.
             planner_input (dict): Planner input object.
-            input_object (InputObject): Agent input object.
+            input_object (InputObject): The input parameters passed by the user.
         Returns:
             dict: The planner result.
         """
@@ -40,22 +41,23 @@ 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)
+        prompt: ChatPrompt = 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(),
                              output_key=self.output_key, memory=memory)
+
         return asyncio.run(llm_chain.acall(inputs=planner_input))
 
-    def handle_prompt(self, agent_model: AgentModel, planner_input: dict) -> Prompt:
+    def handle_prompt(self, agent_model: AgentModel, planner_input: dict) -> ChatPrompt:
         """Prompt module processing.
 
         Args:
             agent_model (AgentModel): Agent model object.
             planner_input (dict): Planner input object.
         Returns:
-            Prompt: The prompt instance.
+            ChatPrompt: The chat prompt instance.
         """
         profile: dict = agent_model.profile
 
@@ -77,4 +79,8 @@ def handle_prompt(self, agent_model: AgentModel, planner_input: dict) -> Prompt:
                 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)
+        chat_prompt = ChatPrompt().build_prompt(profile_prompt_model, self.prompt_assemble_order)
+        image_urls: list = planner_input.pop('image_urls', []) or []
+        if image_urls:
+            chat_prompt.generate_image_prompt(image_urls)
+        return chat_prompt
diff --git a/agentuniverse/agent/plan/planner/reviewing_planner/reviewing_planner.py b/agentuniverse/agent/plan/planner/reviewing_planner/reviewing_planner.py
index a4c23ede..24fe6d52 100644
--- a/agentuniverse/agent/plan/planner/reviewing_planner/reviewing_planner.py
+++ b/agentuniverse/agent/plan/planner/reviewing_planner/reviewing_planner.py
@@ -29,7 +29,7 @@ def invoke(self, agent_model: AgentModel, planner_input: dict, input_object: Inp
         Args:
             agent_model (AgentModel): Agent model object.
             planner_input (dict): Planner input object.
-            input_object (InputObject): Agent input object.
+            input_object (InputObject): The input parameters passed by the user.
         Returns:
             dict: The planner result.
         """
@@ -51,7 +51,7 @@ def handle_prompt(self, agent_model: AgentModel, planner_input: dict) -> Prompt:
 
         Args:
             agent_model (AgentModel): The agent model.
-            planner_input (dict): The agent input.
+            planner_input (dict): The planner input.
         Returns:
             Prompt: The prompt instance.
         """
diff --git a/agentuniverse/base/util/prompt_util.py b/agentuniverse/base/util/prompt_util.py
index 65d43e5d..8a7b999b 100644
--- a/agentuniverse/base/util/prompt_util.py
+++ b/agentuniverse/base/util/prompt_util.py
@@ -5,13 +5,12 @@
 # @Author  : wangchongshi
 # @Email   : wangchongshi.wcs@antgroup.com
 # @FileName: prompt_util.py
-import asyncio
 from typing import List
 
 from langchain.chains.summarize import load_summarize_chain
 from langchain_core.documents import Document
-from langchain_core.prompts import PromptTemplate
 
+from agentuniverse.agent.memory.message import Message
 from agentuniverse.llm.llm import LLM
 from agentuniverse.llm.llm_manager import LLMManager
 from agentuniverse.prompt.prompt_manager import PromptManager
@@ -106,12 +105,30 @@ def generate_template(agent_prompt_model: AgentPromptModel, prompt_assemble_orde
     return "\n".join(values)
 
 
-def process_llm_token(agent_llm: LLM, prompt_template: PromptTemplate, profile: dict, planner_input: dict):
+def generate_chat_template(agent_prompt_model: AgentPromptModel, prompt_assemble_order: list[str]) -> list[Message]:
+    """Convert the agent prompt model to the agentUniverse message list.
+
+    Args:
+        agent_prompt_model (AgentPromptModel): The agent prompt model.
+        prompt_assemble_order (list[str]): The prompt assemble ordered list.
+    Returns:
+        list: The agentUniverse message list.
+    """
+    message_list = []
+    for attr in prompt_assemble_order:
+        value = getattr(agent_prompt_model, attr, None)
+        if value is not None:
+            message_list.append(
+                Message(type=agent_prompt_model.get_message_type(attr), content=value))
+    return message_list
+
+
+def process_llm_token(agent_llm: LLM, lc_prompt_template, 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.
+        lc_prompt_template: The langchain prompt template.
         profile (dict): The profile.
         planner_input (dict): The planner input.
     """
@@ -126,7 +143,7 @@ def process_llm_token(agent_llm: LLM, prompt_template: PromptTemplate, profile:
     summary_prompt_version: str = prompt_processor.get('summary_prompt_version') or 'prompt_processor.summary_cn'
     combine_prompt_version: str = prompt_processor.get('combine_prompt_version') or 'prompt_processor.combine_cn'
 
-    prompt_input_dict = {key: planner_input[key] for key in prompt_template.input_variables if key in planner_input}
+    prompt_input_dict = {key: planner_input[key] for key in lc_prompt_template.input_variables if key in planner_input}
 
     # get the llm instance for prompt compression
     prompt_llm: LLM = LLMManager().get_instance_obj(prompt_processor_llm)
@@ -134,7 +151,7 @@ def process_llm_token(agent_llm: LLM, prompt_template: PromptTemplate, profile:
     if prompt_llm is None:
         prompt_llm = agent_llm
 
-    prompt = prompt_template.format(**prompt_input_dict)
+    prompt = lc_prompt_template.format(**prompt_input_dict)
     # get the number of tokens in the prompt
     prompt_tokens: int = agent_llm.get_num_tokens(prompt)
 
diff --git a/agentuniverse/llm/llm.py b/agentuniverse/llm/llm.py
index 0b6d2687..f56ebb87 100644
--- a/agentuniverse/llm/llm.py
+++ b/agentuniverse/llm/llm.py
@@ -40,7 +40,7 @@ class LLM(ComponentBase):
     model_name: Optional[str] = None
     temperature: Optional[float] = 0.5
     request_timeout: Optional[int] = None
-    max_tokens: Optional[int] = None
+    max_tokens: Optional[int] = 1024
     max_retries: Optional[int] = 2
     streaming: Optional[bool] = False
     ext_info: Optional[dict] = None
diff --git a/agentuniverse/llm/openai_llm.py b/agentuniverse/llm/openai_llm.py
index 139ae49d..69896993 100644
--- a/agentuniverse/llm/openai_llm.py
+++ b/agentuniverse/llm/openai_llm.py
@@ -34,6 +34,8 @@
     "gpt-4-0613": 8192,
     "gpt-4-1106-preview": 128000,
     "gpt-4-turbo": 128000,
+    "gpt-4o": 128000,
+    "gpt-4o-2024-05-13": 128000,
 }
 
 
@@ -92,18 +94,19 @@ def call(self, messages: list, **kwargs: Any) -> Union[LLMOutput, Iterator[LLMOu
         """
         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', streaming),
-            max_tokens=kwargs.pop('max_tokens', self.max_tokens),
-            **kwargs,
-        )
-        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)
+        with self.client as client:
+            chat_completion = client.chat.completions.create(
+                messages=messages,
+                model=kwargs.pop('model', self.model_name),
+                temperature=kwargs.pop('temperature', self.temperature),
+                stream=kwargs.pop('stream', streaming),
+                max_tokens=kwargs.pop('max_tokens', self.max_tokens),
+                **kwargs,
+            )
+            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) -> Union[LLMOutput, AsyncIterator[LLMOutput]]:
         """Asynchronously run the OpenAI LLM.
@@ -114,18 +117,19 @@ async def acall(self, messages: list, **kwargs: Any) -> Union[LLMOutput, AsyncIt
         """
         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', streaming),
-            max_tokens=kwargs.pop('max_tokens', self.max_tokens),
-            **kwargs,
-        )
-        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)
+        async with self.async_client as async_client:
+            chat_completion = await async_client.chat.completions.create(
+                messages=messages,
+                model=kwargs.pop('model', self.model_name),
+                temperature=kwargs.pop('temperature', self.temperature),
+                stream=kwargs.pop('stream', streaming),
+                max_tokens=kwargs.pop('max_tokens', self.max_tokens),
+                **kwargs,
+            )
+            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."""
diff --git a/agentuniverse/prompt/chat_prompt.py b/agentuniverse/prompt/chat_prompt.py
new file mode 100644
index 00000000..df59e944
--- /dev/null
+++ b/agentuniverse/prompt/chat_prompt.py
@@ -0,0 +1,87 @@
+# !/usr/bin/env python3
+# -*- coding:utf-8 -*-
+
+# @Time    : 2024/5/14 14:41
+# @Author  : wangchongshi
+# @Email   : wangchongshi.wcs@antgroup.com
+# @FileName: chat_prompt.py
+import base64
+from typing import List
+import re
+from urllib.parse import urlparse
+
+from langchain_core.prompts import ChatPromptTemplate
+
+from agentuniverse.agent.memory.enum import ChatMessageEnum
+from agentuniverse.agent.memory.message import Message
+from agentuniverse.base.util.prompt_util import generate_chat_template
+from agentuniverse.prompt.prompt import Prompt
+from agentuniverse.prompt.prompt_model import AgentPromptModel
+
+image_extensions = (
+    ".png",
+    ".jpg",
+    ".jpeg",
+    ".gif",
+    ".webp",
+)
+
+
+class ChatPrompt(Prompt):
+    messages: List[Message] = []
+
+    def as_langchain(self) -> ChatPromptTemplate:
+        return ChatPromptTemplate.from_messages(Message.as_langchain_list(self.messages))
+
+    def build_prompt(self, agent_prompt_model: AgentPromptModel, prompt_assemble_order: list[str]) -> 'ChatPrompt':
+        """Build the prompt class.
+
+        Args:
+            agent_prompt_model (AgentPromptModel): The user agent prompt model.
+            prompt_assemble_order (list[str]): The prompt assemble ordered list.
+
+        Returns:
+            ChatPrompt: The chat prompt object.
+        """
+        self.messages = generate_chat_template(agent_prompt_model, prompt_assemble_order)
+        self.input_variables = self.extract_placeholders()
+        return self
+
+    def extract_placeholders(self) -> List[str]:
+        """Extract the placeholders from the messages.
+
+        Returns:
+            List[str]: The placeholders list.
+        """
+        result = []
+        placeholder_pattern = re.compile(r'\{(.*?)}')
+        for message in self.messages:
+            matches = placeholder_pattern.findall(message.content)
+            result.extend(matches)
+        return result
+
+    def generate_image_prompt(self, image_urls: list[str]) -> None:
+        """ Generate the prompt with image urls.
+
+        Args:
+            image_urls (list[str]): The image urls.
+        """
+        if image_urls:
+            for image_url in image_urls:
+                parsed_url = urlparse(image_url)
+                # Check if the URL is a valid HTTP or HTTPS URL.
+                if parsed_url.scheme in ["http", "https"]:
+                    content = [{"type": "image_url", "image_url": {"url": image_url}}]
+                    self.messages.append(Message(type=ChatMessageEnum.HUMAN.value, content=content))
+                # Check if the URL is a local file.
+                elif parsed_url.scheme == "file" or not parsed_url.scheme:
+                    if parsed_url.path.lower().endswith(image_extensions):
+                        with open(parsed_url.path, "rb") as image_file:
+                            base64_image = base64.b64encode(image_file.read()).decode(
+                                "utf-8",
+                            )
+                            extension = parsed_url.path.lower().split(".")[-1]
+                            mime_type = f"image/{extension}"
+                            content = [
+                                {"type": "image_url", "image_url": {"url": f"data:{mime_type};base64,{base64_image}"}}]
+                            self.messages.append(Message(type=ChatMessageEnum.HUMAN.value, content=content))
diff --git a/agentuniverse/prompt/prompt.py b/agentuniverse/prompt/prompt.py
index 3089bfb2..3318e3f7 100644
--- a/agentuniverse/prompt/prompt.py
+++ b/agentuniverse/prompt/prompt.py
@@ -27,7 +27,7 @@ class Prompt(ComponentBase):
     def __init__(self, **kwargs):
         super().__init__(component_type=ComponentEnum.PROMPT, **kwargs)
 
-    def as_langchain(self) -> PromptTemplate:
+    def as_langchain(self):
         """Convert the prompt template into a LangChain prompt template.
 
         Returns:
@@ -44,7 +44,7 @@ def build_prompt(self, agent_prompt_model: AgentPromptModel, prompt_assemble_ord
             prompt_assemble_order (list[str]): The prompt assemble ordered list.
 
         Returns:
-            PromptTemplate: The prompt template.
+            Prompt: The prompt object.
         """
         self.prompt_template = generate_template(agent_prompt_model, prompt_assemble_order)
         self.input_variables = re.findall(r'\{(.*?)}', self.prompt_template)
diff --git a/agentuniverse/prompt/prompt_model.py b/agentuniverse/prompt/prompt_model.py
index 491558ff..4fd4e8ec 100644
--- a/agentuniverse/prompt/prompt_model.py
+++ b/agentuniverse/prompt/prompt_model.py
@@ -9,6 +9,8 @@
 
 from pydantic import BaseModel
 
+from agentuniverse.agent.memory.enum import ChatMessageEnum
+
 
 class AgentPromptModel(BaseModel):
     """Agent Prompt Model class."""
@@ -16,6 +18,9 @@ class AgentPromptModel(BaseModel):
     introduction: Optional[str] = None
     target: Optional[str] = None
     instruction: Optional[str] = None
+    _message_type_mapping: dict[str, str] = {'introduction': ChatMessageEnum.SYSTEM.value,
+                                             'target': ChatMessageEnum.SYSTEM.value,
+                                             'instruction': ChatMessageEnum.HUMAN.value}
 
     def __add__(self, other):
         """Merge two objects into one object."""
@@ -33,4 +38,15 @@ def __bool__(self):
         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)
+        return bool(self.introduction or self.target or self.instruction)
+
+    def get_message_type(self, attribute_name: str) -> str:
+        """ Get the message type of the attribute in the agent prompt model.
+
+            Args:
+                attribute_name (str): The name of the attribute.
+                
+            Returns:
+                str: The message type of the attribute(system/human/ai).
+        """
+        return self._message_type_mapping.get(attribute_name, ChatMessageEnum.HUMAN.value)
diff --git a/docs/guidebook/_picture/agent.jpg b/docs/guidebook/_picture/agent.jpg
index 14fc58b7..d6098181 100644
Binary files a/docs/guidebook/_picture/agent.jpg and b/docs/guidebook/_picture/agent.jpg differ
diff --git a/docs/guidebook/en/0_index.md b/docs/guidebook/en/0_index.md
index c4e1a0f1..bac6850f 100644
--- a/docs/guidebook/en/0_index.md
+++ b/docs/guidebook/en/0_index.md
@@ -12,7 +12,9 @@
 
 * 2.1 Framework Principles
 * 2.2 [Domain Components](2_2_Domain_Component_Principles.md)
-  * 2.2.1 [Agent](2_1_1_Agent.md)
+  * 2.2.1 [Agent](2_2_1_Agent.md)
+    * 2.2.1.1 [Create And Use](2_2_1_Agent_Create_And_Use.md)
+    * 2.2.1.2 [Related Domain Objects](2_2_1_Agents_Related_Domain_Objects.md)
   * 2.2.2 LLM
   * 2.2.3 Tool
   * 2.2.4 Knowledge
@@ -40,6 +42,7 @@
   * 3.1.6 Planner
 * 3.2 Technical Components
   * 3.2.1 RPC
+    * 3.2.1.1 [gRPC](3_2_1_gRPC.md)
   * 3.2.2 Store
   * 3.2.3 Msg
   * 3.2.4 Logging
@@ -50,9 +53,10 @@
 **5. Best Practices**
 * 5.1 Operations and Deployment
   * 5.1.1 [Docker Containerization Solution](5_1_1_Docker_Container_Deployment.md)
+  * 5.1.2 [K8S Solution](5_1_2_K8S_Deployment.md)
 
 **6. Series of Articles**
 
 **7. Frequently Asked Questions (FAQ)**
 
-**[8. Contact Us](8_1_Contact_Us.md)**
+**[8. Contact Us](6_1_Contact_Us.md)**
diff --git a/docs/guidebook/en/1_3_Quick_Start.md b/docs/guidebook/en/1_3_Quick_Start.md
index cbf3daff..2a310cb6 100644
--- a/docs/guidebook/en/1_3_Quick_Start.md
+++ b/docs/guidebook/en/1_3_Quick_Start.md
@@ -117,10 +117,9 @@ class DemoRagAgent(Agent):
     def output_keys(self) -> list[str]:
         return ['output']
 
-    def parse_input(self, input_object: InputObject, planner_input: dict) -> dict:
-        input = input_object.get_data('input')
-        planner_input['input'] = input
-        return planner_input
+    def parse_input(self, input_object: InputObject, agent_input: dict) -> dict:
+        agent_input['input'] = input_object.get_data('input')
+        return agent_input
 
     def parse_result(self, planner_result: dict) -> dict:
         return planner_result
diff --git a/docs/guidebook/en/2_1_1_Agent.md b/docs/guidebook/en/2_2_1_Agent.md
similarity index 85%
rename from docs/guidebook/en/2_1_1_Agent.md
rename to docs/guidebook/en/2_2_1_Agent.md
index 1bff4173..8f8f0374 100644
--- a/docs/guidebook/en/2_1_1_Agent.md
+++ b/docs/guidebook/en/2_2_1_Agent.md
@@ -9,6 +9,9 @@ Let's introduce the roles of the various components within the Agent component s
 ## Profile
 This section is the global settings of the Agent, including the Agent's Target, Introduction, and LLM parts.
 
+### Introduction
+For the description of the Agent's role, for example: You are an AI assistant skilled in information analysis.
+
 ### Target
 The goal that the Agent needs to achieve. The Agent will revolve around this goal to complete a series of subsequent tasks.
   
@@ -20,12 +23,11 @@ When setting the goal for an agent, it needs to be concise and impactful, descri
 ❌ Bad examples: aimless descriptions such as "just chatting."
 ```
   
-### Introduction
-The comprehensive introduction of the Agent includes the setting of the Agent's personality, background knowledge, behavioral guidance, etc.
+### Instruction
+It includes specific settings for the Agent, such as personality traits, background knowledge, and behavioral guidelines.
 
 ```text
-How to write a good Introduction? We can adopt the following paradigm:
-The role played by the agent (recommended) + 
+How to write a good Instruction? We can adopt the following paradigm:
 A clear scope of responsibilities the agent excels in (recommended) + Personality setting (fill in as needed) + 
 Background knowledge (fill in as needed) + 
 User input format (fill in as needed) + 
@@ -39,13 +41,14 @@ You are Jerry's personal exclusive chatbot [The role played by the agent].
 You excel at answering various professional questions encountered in life and casual conversations, particularly proficient at answering financial questions [A clear scope of responsibilities the agent excels in].
 Your personality is cheerful and lively [Personality setting].
 Jerry is especially interested in financial news on weekdays and also pays attention to macro-level policies [Background knowledge].
-Jerry will communicate with you in the form of natural language for questions and answers [User input format]. Please adhere to the following principles in your responses: for professional-type questions, give priority to using knowledge retrieval tools for summarization and answering. Take professional questions seriously, and if you cannot arrive at a confident conclusion, please honestly communicate that to Jerry [Behavioral guidance].
+Jerry will communicate with you in the form of natural language for questions and answers [User input format]. 
+Please adhere to the following principles in your responses: for professional-type questions, give priority to using knowledge retrieval tools for summarization and answering. Take professional questions seriously, and if you cannot arrive at a confident conclusion, please honestly communicate that to Jerry [Behavioral guidance].
 Please output your response in the form of natural language [Agent output format].
 Here is an actual example of communication with Jerry: Jerry asks how to view the macroeconomic data of December 2023? Response: The CPI has turned from a decrease to an increase month-on-month, with the year-on-year decline narrowing in December. Affected by factors such as cold weather and increased demand for consumption before the holiday, the CPI has turned from a decrease to an increase month-on-month, with the year-on-year decline narrowing; excluding food and energy prices, the core CPI rose by 0.6% year-on-year, with the increase remaining stable. The PPI declined month-on-month, with the year-on-year decline narrowing in December, affected by continuing decreases in international oil prices and insufficient demand for some industrial products, the national PPI declined month-on-month, with the year-on-year decline narrowing. [Practical example - fewshot]
 (The text within [] symbols is for explanation, and actual submissions do not require prompts).
 
 ❌ For instance, a bad example would be:
-You are a fitness coach, skilled at providing various fitness plans tailored to different groups of people (the information provided is too scant, resulting in high uncertainty in outcomes, leading to generic advice that often does not meet the actual demands).
+You are skilled at providing various fitness plans tailored to different groups of people (the information provided is too scant, resulting in high uncertainty in outcomes, leading to generic advice that often does not meet the actual demands).
 ```
 
 ### LLM
@@ -68,5 +71,8 @@ Tools available for Agents. agentUniverse offers numerous existing Tool componen
 ### Knowledge
 Knowledge available for Agents. agentUniverse provides a wide range of existing Knowledge components and standard methods for Knowledge customization. You can opt to use or define the Knowledge you want to use, and then load it into the Agent through configuration. In addition, agentUniverse supports the expanded integration of underlying storage technology middleware, such as SQLite, Chroma, and other storage options, meaning you can access data from any storage medium. We will explain in detail how they work in the Knowledge section.
 
-# Summary
+## Memory
+The memory available for Agents. agentUniverse provides standard optional memory types, and in most cases, users do not need to concern themselves with the specific implementation of memory. The memory component also offers the capability for users to customize it themselves. We will explain in detail how they work in the Memory section.
+
+# Conclusion
 Up to this point, you have gained a comprehensive understanding of the components and principles of an Agent. In the next section, we will specifically introduce the standard definitions of Agent components, how to customize an Agent, and how to use an Agent, among other topics.
\ No newline at end of file
diff --git a/docs/guidebook/en/2_2_1_Agent_Create_And_Use.md b/docs/guidebook/en/2_2_1_Agent_Create_And_Use.md
new file mode 100644
index 00000000..8563cc2e
--- /dev/null
+++ b/docs/guidebook/en/2_2_1_Agent_Create_And_Use.md
@@ -0,0 +1,382 @@
+# How to create agents.
+You might have already learned how to quickly create an agent in the [Quick Start](1_3_Quick_Start.md) chapter, or grasped the important components of an agent in the [Principles of Agents](2_2_1_Agent.md). In this section, we will further elaborate on how to create an agent in detail.
+
+Based on the design features of the agentUniverse domain components, creating an agent consists of two parts during the creation process.
+* agent_xx.yaml
+* agent_xx.py
+
+Among them, `agent_xx.yaml` must be created, which includes important attribute information of the agent such as Introduction, Target, Instruction, LLM, etc.; `agent_xx.py` is created as needed, containing specific behaviors of the agent and supporting users to inject custom domain behaviors into the agent. Understanding this principle, let's take a closer look at how to create these two parts.
+
+## Creating Agent Configuration - agent_xx.yaml
+We will provide detailed descriptions of each component in the configuration.
+
+### Setting the basic information of the agent.
+**`info` - basic information of the agent**
+* `name`:  name of the agent
+* `description`:  description of the agent
+
+### Setting the global configurations for the agent.
+**`profile` - Agent global settings.**
+* `introduction`:  introduction to the agent's role
+* `target`:  target of the agent
+* `instruction`: instruction of the agent
+* `llm_model`: The LLM used by the agent
+  * `name`: name of LLM
+  * `model_name`: model_name of LLM
+
+  You can choose any existing LLM or connect to any LLM of your choice. We will not elaborate on this part here; you can refer to the LLM section for more details.
+
+### Setting the agent's plan
+**`plan` - plan of agent**
+* `planner` : planner of agent
+  * `name`: name of planner
+  
+  You can choose any existing Planner or connect to any Planner of your choice. We will not elaborate on this part here; you can refer to the Planner section for more details.
+
+### Setting the agent's action
+**`action` - action of agent**
+* `Tool` : Tools available for the agent's use.
+  * tool_name_list，list of tool names, for example:  
+    \- tool_name_a  
+    \- tool_name_b  
+    \- tool_name_c  
+
+  You can choose any existing Tool or connect to any Tool of your choice. We will not elaborate on this part here; you can refer to the Tool section for more details.
+
+* `Knowledge` : Knowledge available for the agent's use.
+  * knowledge_name_list，list of knowledge names, for example:   
+    \- knowledge_name_a  
+    \- knowledge_name_b  
+    \- knowledge_name_c
+  
+  You can choose any existing Knowledge or connect to any Knowledge of your choice. We will not elaborate on this part here; you can refer to the Knowledge section for more details.
+
+### Setting up the agent's memory.
+**`memory` - memory of agent**
+
+The agent already has a default memory mode built-in, so you do not need to set it up. Additionally, memory supports customization and type selection, and we will make this capability available in an upcoming feature.
+
+### Setting up component metadata.
+**`metadata` - metadata of component**
+* `type` : type of component，use 'AGENT'
+* `module`: Agent entity package path
+* `class`: Agent entity class name
+
+All provided Agent components will have their corresponding `module` and `class` copied to this section. This section will integrate all configurations and behaviors of the agent into a whole. If you have extended the behavior of the agent, you need to fill in this section according to the actual path. We will further explain this in the "Creating from an Existing Agent Object" section later in the text.
+
+### An actual example of an agent configuration.
+```yaml
+info:
+  name: 'demo_rag_agent'
+  description: 'demo rag agent'
+profile:
+  introduction: You are an AI assistant proficient in information analysis.
+  target: Your goal is to determine whether the answer to a question provides valuable information and to make suggestions and evaluations about the answer.
+  instruction: |
+    The rules you need to follow are:
+
+    1.Must answer the question posed by the user in Chinese, combining the background information and your knowledge.
+    2.Generate structured answers, and when necessary, use blank lines to enhance the reading experience.
+    3.Do not adopt incorrect information from the background.
+    4.Consider the relevance of the answer to the question, and do not provide answers that are not helpful to the question.
+    5.Answer the question comprehensively, with emphasis on the main points, without excessive fancy wording.
+    6.Do not make vague speculations.
+    7.Use numerical information as much as possible. 
+    
+    Background information is: {background} 
+    
+    Begin! 
+    
+    The question to answer is: {input}
+  llm_model:
+    name: 'demo_llm'
+    model_name: 'gpt-4o'
+plan:
+  planner:
+    name: 'rag_planner'
+action:
+  tool:
+    - 'google_search_tool'
+#  knowledge:
+#    - 'knowledge_a'
+metadata:
+  type: 'AGENT'
+  module: 'sample_standard_app.app.core.agent.rag_agent_case.demo_rag_agent'
+  class: 'DemoRagAgent'
+```
+The above is an actual example of an agent configuration. In addition to the standard configuration items introduced above, the observant among you may have noticed variables in the prompt like `{background}` and `{input}`. This is a very practical prompt replacement feature, which we will explain in the section on defining behaviors in the agent domain.
+
+You can find more agent configuration YAML examples in our sample project under the path `sample_standard_app.app.core.agent`.
+
+In addition to this, agentUniverse does not restrict users from extending the YAML configuration content for agents. You can create any custom configuration key according to your own requirements, but please be careful not to duplicate the default configuration keywords mentioned above.
+
+## Creating Agent Domain Behavior Definition - agent_xx.py
+In this section, you can orchestrate and customize the behavior of any agent. Of course, if you are completely using existing Agent capabilities, this section is not mandatory.
+
+In this section, we will focus on commonly used definitions of agent domain behavior and the common techniques you may use in the actual process of defining agent domain behaviors.
+
+### Create an Agent class object.
+Create the corresponding Agent class object and inherit the AgentUniverse framework's base class Agent.
+
+### Customize the corresponding agent domain behaviors.
+Common customizable agent behaviors are as follows.
+
+#### input_keys method
+Represents the list of input key parameters from users in the agent's execution process, which needs to be implemented by each custom Agent class.
+
+For example, if the agent runs with only one parameter passed in, such as question=xxx, then the input_keys method should return ['question'].
+
+#### output_keys method
+Represents the list of output key parameters when the agent's execution ends, which needs to be implemented by each custom Agent class.
+
+For example, if the agent outputs a result that includes a response, then the output_keys method should return ['response'].
+
+#### parse_input method
+The input processing node before agent execution; an agent's input can be natural language or structured data such as JSON. You can process any user input in this part, and it needs to be implemented by each custom Agent class.
+
+This section has two input parameters, as follows:
+
+* `input_object`: The original data inputted to the agent
+  * You can retrieve corresponding data from input_object using the `input_object.get_data('input_key')` method.
+  
+    For example, if a user inputs `question=xxx` to the agent, we can obtain the current question from the user by using `input_object.get_data('question')`.
+
+* `agent_input`: The data processed by the agent's input handler, of type `dict`.
+  * `agent_input` includes the following key parameters and data by default.
+    * `chat_history`: Includes historical chat data.
+    * `background`: Includes background.
+    * `date`: Includes the current date.
+  * Append the user input to agent_input.
+    * For example: `agent_input['input'] = input_object.get_data('question')`.
+  
+The output object for the `parse_input` method is generally used `agent_input`.
+
+#### parse_result method
+The output processing node before agent execution, where an agent's output can be natural language or structured data such as JSON. You can manage any content that needs to be output in this part, and it needs to be implemented by each custom Agent class.
+
+This section has one input parameter, as follows:
+* `agent_result`: Agent output data, of type `dict`.  
+`parse_result`方法的输出对象一般使用`agent_result`
+
+#### execute method
+This method is the core entry point for the agent's execution flow. The agent's base class implements the execution method by default, and users can also override this method to customize the execution method for any agent.
+
+##### Default execute implementation.
+* The default logic for the execute method in the agent base class is as follows:
+
+  * Get the planner name corresponding to the agent YAML configuration
+  * Obtain a Planner instance through the Planner manager
+  * Execute the invoke method of the Planner instance
+
+##### Custom execute implementation.
+You can also customize the execution flow of the agent by overriding the execute method. Overriding execute will override the default implementation of the agent's base class, meaning the agent will lose the ability to automatically select a Planner. If needed, you can refer to the default implementation of the agent's base class to load and use the corresponding planner.
+
+Below is an example of a custom execute implementation:
+```text
+def execute(self, input_object: InputObject, agent_input: dict) -> dict:
+    # Do anything, as exemplified below.
+    
+    # Invoke tool A to get data.
+    
+    # Analyze the data and determine whether it can answer the user's questions.
+    
+    # Organize language to answer questions.
+    
+    # Output the answer.
+    
+    return {'output': 'xxx'}
+```
+
+#### Get the properties of the agent object.
+Through `self.agent_model`, the agent object can access the properties of the agent. In the definition of agent domain behaviors, you can read all the properties configured in the agent configuration section.
+
+A specific example is as follows:
+```text
+def execute(self, input_object: InputObject, agent_input: dict) -> dict:
+    """Execute agent instance.
+
+    Args:
+        input_object (InputObject): input parameters passed by the user.
+        agent_input (dict): agent input parsed from `input_object` by the user.
+
+    Returns:
+        dict: planner result generated by the planner execution.
+    """
+
+    planner_base: Planner = PlannerManager().get_instance_obj(self.agent_model.plan.get('planner').get('name'))
+    planner_result = planner_base.invoke(self.agent_model, agent_input, input_object)
+    return planner_result
+```
+
+In this example, the `plan` section from the agent configuration attributes is accessed within the execution method using `self.agent_model.plan`, and further, the actual name of the `planner` is obtained through the get method.
+
+
+The properties and domain behaviors of the agent are both dependent on the Agent base class in the agentUniverse framework, which is located at `agentuniverse.agent.agent.Agent`. We will also focus on the underlying objects in the sections on agents and related domain objects. If you are interested in the underlying technical implementation, you can further refer to the corresponding code and documentation.
+
+## Pay attention to the package path where your defined agent is located
+With the agent configuration and domain definition outlined above, you now have mastered all the steps to create an agent. Moving forward, we will use these agents, but before doing so, please ensure that the created agents are within the correct package scan path.
+
+In the `config.toml` of the agentUniverse project, you need to configure the package corresponding to the agent file. Please confirm again that the package path where your created file is located is under the `CORE_PACKAGE` in the `agent` path or its subpaths.
+
+Taking the configuration of the example project as a reference, it would be as follows：
+
+```yaml
+[CORE_PACKAGE]
+# Scan and register agent components for all paths under this list, with priority over the default.
+agent = ['sample_standard_app.app.core.agent']
+```
+
+## Practical tips for agent development
+### Customize and orchestrate the execution process of agents freely
+In the 'Creating Agent Domain Behavior Definitions' section of this document, we have already detailed how to customize an execute method. This method is often used in practice customizing processes and inject SOPs (Standard Operating Procedures) according to user demands.
+
+### How to dynamically adjust settings based on user input
+
+**Method 1 (Recommended): Through the standard prompt template variable replacement method.**  
+
+In the "A Practical Example of an Agent Configuration" section of this document, the prompt includes variables like `{background}`,`{input}`, etc. This feature is the prompt variable template replacement function, aimed at dynamically influencing the prompt based on the user's input. One only needs to define the text using `{variable}` format in the agent configuration settings section, and define it in the parse_input's `agent_input` to dynamically replace the corresponding prompt based on the input portion.
+
+For example, in the sample agent `sample_standard_app.app.core.agent.rag_agent_case.demo_rag_agent.py`, there is the following `parse_input` method.
+
+```text
+def parse_input(self, input_object: InputObject, agent_input: dict) -> dict:
+    agent_input['input'] = input_object.get_data('input')
+    return agent_input
+```
+
+In its agent settings `sample_standard_app.app.core.agent.rag_agent_case.demo_rag_agent.yaml`, in the `instruction` section, we can see the following configuration.
+
+```text
+instruction: |
+    The rules you need to follow are:
+
+    1.Must answer the question posed by the user in Chinese, combining the background information and your knowledge.
+    2.Generate structured answers, and when necessary, use blank lines to enhance the reading experience.
+    3.Do not adopt incorrect information from the background.
+    4.Consider the relevance of the answer to the question, and do not provide answers that are not helpful to the question.
+    5.Answer the question comprehensively, with emphasis on the main points, without excessive fancy wording.
+    6.Do not make vague speculations.
+    7.Use numerical information as much as possible. 
+    
+    Background information is: {background} 
+    
+    Begin! 
+    
+    The question to answer is: {input}
+```
+
+Through this process, we can bring each input, memory or background knowledge, and any information you care about into the interaction between the agent and the LLM using this method.
+
+**Method 2: Adjust the prompt within the parse_input method or the execute method**
+
+Through the agent's `parse_input` method or `execute` method, we can customize the agent in terms of data or behavior. Additionally, by combining the get method in `self.agent_model` with the agent input parameter `input_object`, this means that you can modify any of your settings content through these customization methods.
+
+### Create an agent from an existing agent object
+
+In the actual process of creating applications, we may have many agents of the same type. For example, we might want to create several Retrieval Augmented Generation (RAG) type agents to be used in different question-answering scenarios. By analyzing their similarities and differences, it is not difficult to find that most RAG type agents share the following commonalities and differences:
+
+* Main similarity: They often need to retrieve multiple types of knowledge simultaneously.
+* Main difference: RAG agents in different scenarios need to retrieve using different tools and may have different global agent settings.
+
+Upon further analysis, we can achieve this goal through the same domain behavior and differentiated attribute configurations. This is why configuring settings in YAML is essential during the agent creation process, while domain behavior customization is based on actual needs.
+
+Fortunately, we have a significant number of effective agent types, and they are still expanding. As described in this case, combining the agent domain component setting process, we only need to set different types of agent configuration YAMLs, and complete this goal by setting `metadata`.
+
+
+For example:
+
+**Financial RAG Agent Settings**
+```yaml
+info:
+  name: 'financial_RAG_agent'
+  description: 'demo financial rag agent'
+profile:
+  introduction:  Demo introduction, such as you are a financial RAG agent.
+  target: Demo target, such as use financial tools to retrieve and enhance answer performance.
+  instruction: |
+    demo instruction, xxx, {input}
+  llm_model:
+    name: 'demo_llm'
+    model_name: 'gpt-4o'
+plan:
+  planner:
+    name: 'rag_planner'
+action:
+  tool:
+    - 'financial_data_tool'
+metadata:
+  type: 'AGENT'
+  module: 'agentuniverse.agent.default.rag_agent.rag_agent'
+  class: 'RagAgent'
+```
+
+**Tech RAG Agent Settings**
+```yaml
+info:
+  name: 'tech_RAG_agent'
+  description: 'demo tech rag agent'
+profile:
+  introduction:  Demo introduction, such as you are a tech RAG agent.
+  target: Demo target, such as use tech tools to retrieve and enhance answer performance.
+  instruction: |
+    demo instruction, xxx, {input}
+  llm_model:
+    name: 'demo_llm'
+    model_name: 'gpt-4o'
+plan:
+  planner:
+    name: 'rag_planner'
+action:
+  tool:
+    - 'tech_data_tool'
+metadata:
+  type: 'AGENT'
+  module: 'agentuniverse.agent.default.rag_agent.rag_agent'
+  class: 'RagAgent'
+```
+
+You can find more information about existing agents and understand their roles in the "Learn More About Existing Agents" section of this document.
+
+# How to Use an Agent
+In the agentUniverse, all agent entities are managed by a global agent manager. If you need to use an agent during any framework execution process, you can do so through the agent manager. Additionally, leveraging the framework's service capabilities, you can quickly turn an agent into a service and make network calls to it using standard HTTP or RPC protocols.
+
+## Solution 1: Use the agent manager
+
+Through the `get_instance_obj('agent_name_xxx')` method in the agent manager, you can obtain the agent instance with the corresponding name. Meanwhile, the agent can be utilized through its own `run(input='xxx')` method. The `test_rag_agent(self)` method in the test class below demonstrates debugging the agent using this approach.
+
+```python
+import unittest
+
+from agentuniverse.agent.agent import Agent
+from agentuniverse.agent.agent_manager import AgentManager
+from agentuniverse.agent.output_object import OutputObject
+from agentuniverse.base.agentuniverse import AgentUniverse
+
+
+class RagAgentTest(unittest.TestCase):
+    """
+    Test cases for the rag agent
+    """
+
+    def setUp(self) -> None:
+        AgentUniverse().start(config_path='../../config/config.toml')
+
+    def test_rag_agent(self):
+        """Test demo rag agent."""
+        instance: Agent = AgentManager().get_instance_obj('demo_rag_agent')
+        output_object: OutputObject = instance.run(input="What is the reason for the sharp rise in Nvidia's stock?")
+        print(output_object.get_data('output'))
+
+if __name__ == '__main__':
+    unittest.main()
+```
+
+## Solution 2: Utilize the service capabilities of agent_serve
+
+The agentUniverse offers a variety of standard web serve capabilities, along with standard HTTP and RPC protocols. You can further refer to the documentation sections on [Service Registration and Usage](2_4_1_Service_Registration_and_Usage.md) and [Web_Server](2_4_1_Web_Server.md).
+
+# Learn more about agents
+The agents provided by the framework can be found under the `agentuniverse.agent.default` package path. You can further explore the corresponding code or learn more about them in our extension component introduction section.
+
+# Conclusion
+By now, you have mastered all the content related to the creation and use of agents. Let's use this knowledge to customize your own exclusive agent.
\ No newline at end of file
diff --git a/docs/guidebook/en/2_2_1_Agents_Related_Domain_Objects.md b/docs/guidebook/en/2_2_1_Agents_Related_Domain_Objects.md
new file mode 100644
index 00000000..0e6af2e0
--- /dev/null
+++ b/docs/guidebook/en/2_2_1_Agents_Related_Domain_Objects.md
@@ -0,0 +1,17 @@
+# Agents and Related Domain Objects
+In this chapter, we will highlight agents and related core domain objects. We have omitted their corresponding code parts. If you wish to learn more, please read the [API Reference](4_1_API_Reference.md) Section.
+
+## Agent Base Class
+Package path: `agentuniverse.agent.agent.Agent`
+
+## Agent Manager
+Package path: `agentuniverse.agent.agent_manager.AgentManager`
+
+## Agent Model Attribute Class
+Package path: `agentuniverse.agent.agent_model.AgentModel`
+
+## Input Object
+Package path: `agentuniverse.agent.input_object.InputObject`
+
+## Output Object
+Package path:`agentuniverse.agent.output_object.OutputObject`
diff --git a/docs/guidebook/en/5_1_2_K8S_Deployment.md b/docs/guidebook/en/5_1_2_K8S_Deployment.md
new file mode 100644
index 00000000..2fde72fe
--- /dev/null
+++ b/docs/guidebook/en/5_1_2_K8S_Deployment.md
@@ -0,0 +1,109 @@
+# High Availability Deployment with K8S
+AgentUniverse provides standard working environment images, designed to support containerized deployments on Kubernetes (K8S) clusters. This guide will show you how to utilize these working environment images to deploy and set up a cluster on K8S.
+Official K8S Documentation: [Kubernetes Setup Documentation](https://kubernetes.io/docs/setup/)
+
+## 1. Resource Configuration
+First, you need to configure the necessary resource files. Below is an example used to define the required Namespace, Deployment, and Service resources using a YAML configuration file:
+
+```yaml
+apiVersion: v1
+kind: Namespace
+metadata:
+  name: agent-namespace
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: agentuniverse-deployment
+  namespace: agent-namespace
+  labels:
+    app: agentuniverse
+spec:
+  replicas: 3
+  selector:
+    matchLabels:
+      app: agentuniverse
+  template:
+    metadata:
+      labels:
+        app: agentuniverse
+    spec:
+      containers:
+      - name: agentuniverse-container
+        image: registry.cn-hangzhou.aliyuncs.com/agent_universe/agent_universe:0.0.5_centos8_beta
+        ports:
+        - containerPort: 8888
+        command: ["/bin/bash", "-c"]
+        args: ["git clone git@github.com:alipay/agentUniverse.git; mv agentUniverse/sample_standard_app /usr/local/etc/workspace/project; /bin/bash --login /usr/local/etc/workspace/shell/start.sh"]
+        # Uncomment and replace "XXX" with your key to configure the agent
+        # env:
+        # - name: OPENAI_API_KEY
+        #   value: "XXX"
+---
+apiVersion: v1
+kind: Service
+metadata:
+  name: agentuniverse-service
+  namespace: agent-namespace
+spec:
+  selector:
+    app: agentuniverse
+  ports:
+  - protocol: TCP
+    port: 9999
+    targetPort: 8888
+```
+
+### 1.1 Setting Environment Variables for AgentUniverse Project
+
+#### Method 1 (Recommended)
+
+In the resource configuration file, uncomment the `env` section and replace `value` with your key. For additional security considerations, it's recommended to use K8S officially recommended methods, such as ConfigMap. See the [ConfigMap Configuration Documentation](https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/).
+
+#### Method 2
+
+Please refer to the description at the beginning of the configuration file: [Quick Start Guide](https://github.com/alipay/agentUniverse/blob/master/docs/guidebook/zh/1_3_快速开始.md)
+
+## 2. Building Resources
+
+Create and apply the aforementioned configuration file:
+
+```
+kubectl apply -f agentuniverse.yaml
+```
+
+## 3. Verifying Resources
+
+Verify that all resources have been correctly deployed:
+
+```
+kubectl get all -n agent-namespace
+```
+
+![Resource Deployment Status](../_picture/k8s_resource.png)
+
+## 4. Accessing AgentUniverse Services from Inside the Cluster
+
+To access AgentUniverse services from within the cluster, use the following command line example:
+
+```
+kubectl exec -it [Pod Name] -n agent-namespace -- curl http://agentuniverse-service:9999
+```
+
+### 4.1 Examples
+
+#### 4.1.1 Connectivity Test
+
+```
+kubectl exec -it agentuniverse-deployment-55cfd778d-g7d9d -n agent-namespace -- curl http://agentuniverse-service:9999/echo
+```
+
+![Connectivity Test](../_picture/k8s_hello.png)
+
+#### 4.1.2 Q&A Test
+
+```
+kubectl exec -it agentuniverse-deployment-55cfd778d-g7d9d -n agent-namespace -- curl -X POST -H "Content-Type: application/json" -d '{"service_id":"demo_service","params":{"input":"(18+3-5)/2*4=?"}}' http://agentuniverse-service:9999/service_run
+```
+
+![Q&A Test](../_picture/k8s_question.png)
diff --git a/docs/guidebook/en/8_1_Contact_Us.md b/docs/guidebook/en/6_1_Contact_Us.md
similarity index 100%
rename from docs/guidebook/en/8_1_Contact_Us.md
rename to docs/guidebook/en/6_1_Contact_Us.md
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 fc6145ec..878ffc9b 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"
@@ -16,7 +16,9 @@
 
 * 2.1 框架原理
 * 2.2 [领域组件](2_2_领域组件原理.md)
-  * 2.2.1 [智能体(Agent)](2_1_1_智能体.md)
+  * 2.2.1 [智能体(Agent)](2_2_1_智能体.md)
+    * 2.2.1.1 [智能体创建与使用](2_2_1_智能体创建与使用.md)
+    * 2.2.1.2 [智能体及相关领域对象](2_2_1_智能体及相关领域对象.md)
   * 2.2.2 模型(LLM)
   * 2.2.3 工具(Tool)
   * 2.2.4 知识(Knowledge)
@@ -44,6 +46,7 @@
   * 3.1.6 规划(Planner)
 * 3.2 技术组件
   * 3.2.1 RPC
+    * 3.2.1.1 [gRPC](3_2_1_gRPC.md)
   * 3.2.2 存储 (Store)
   * 3.2.3 消息(Msg)
   * 3.2.4 日志(Logging)
@@ -53,10 +56,11 @@
 
 **5.最佳实践**
 * 5.1 运维部署
-  * 5.1.1 [docker容器化方案](5_1_1_Docker容器化部署.md)
+  * 5.1.1 [Docker容器化方案](5_1_1_Docker容器化部署.md)
+  * 5.1.2 [K8S部署方案](5_1_2_K8S部署.md)
 
 **6.系列文章**
 
 **7.常见问题FAQ**
 
-**[8.联系我们](8_1_联系我们.md)**
+**[8.联系我们](6_1_联系我们.md)**
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 0677efbe..dd3551e3 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"
@@ -116,10 +116,9 @@ class DemoRagAgent(Agent):
     def output_keys(self) -> list[str]:
         return ['output']
 
-    def parse_input(self, input_object: InputObject, planner_input: dict) -> dict:
-        input = input_object.get_data('input')
-        planner_input['input'] = input
-        return planner_input
+    def parse_input(self, input_object: InputObject, agent_input: dict) -> dict:
+        agent_input['input'] = input_object.get_data('input')
+        return agent_input
 
     def parse_result(self, planner_result: dict) -> dict:
         return planner_result
diff --git "a/docs/guidebook/zh/2_1_1_\346\231\272\350\203\275\344\275\223.md" "b/docs/guidebook/zh/2_2_1_\346\231\272\350\203\275\344\275\223.md"
similarity index 81%
rename from "docs/guidebook/zh/2_1_1_\346\231\272\350\203\275\344\275\223.md"
rename to "docs/guidebook/zh/2_2_1_\346\231\272\350\203\275\344\275\223.md"
index 7f26accd..15020d06 100644
--- "a/docs/guidebook/zh/2_1_1_\346\231\272\350\203\275\344\275\223.md"
+++ "b/docs/guidebook/zh/2_2_1_\346\231\272\350\203\275\344\275\223.md"
@@ -1,5 +1,5 @@
 # 智能体(Agent)
-智能体（Agent）能够自主行动完成人类设定的目标，它具备学习、推理、决策和执行能力，通过任务拆分、工具知识使用、进度控制等步骤，实现目标并自主结束工作。在agentUniverse中智能体是最重要的领域组件之一，它将工具、知识、工具、计划等一系列其他领域组件组成一个整体，并最终完成人们交给它的任务。
+智能体（Agent）能够自主行动实现人类设定的目标，它具备学习、推理、决策和执行能力，通过任务拆分、工具知识使用、进度控制等步骤，实现目标并自主结束工作。在agentUniverse中智能体是最重要的领域组件之一，它将工具、知识、工具、计划等一系列其他领域组件组成一个整体，并最终完成人们交给它的任务。
 
 智能体的表现直接影响了应用服务能力的强弱，在复杂的服务场景中往往需要一个或多个非常出色的智能体去完成任务。agentUniverse根据业界与学界的成果结合实际产业落地过程中的经验拥有如下对于agent的定义，见图。
 ![](../_picture/agent.jpg)
@@ -9,6 +9,9 @@
 ## 全局设定（Profile）
 该部分是Agent的全局设定，包含了Agent的Target、Introduction、LLM部分。
 
+### 介绍（Introduction）
+对于Agent的角色描述，例如：你是一位精通信息分析的ai助手。
+
 ### 目标（Target）
 Agent需要实现的核心目标, Agent会围绕着这个目标去完成后续一系列的工作。
   
@@ -19,27 +22,27 @@ Agent需要实现的核心目标, Agent会围绕着这个目标去完成后续
 
 ❌ 不太好的例子，如：随便聊聊等无目的性的描述  
 ```
-  
-### 介绍（Introduction）
-对于Agent的全面介绍，包含了对于Agent的性格设定、背景知识、行为指导等。
+
+### 指令（Instruction）
+包含了对于Agent的具体设定，如性格设定、背景知识、行为指导等。
 
 ```text
-如何写好Introduction？我们可以采取如下范式：
-智能体扮演的角色（推荐填写）+  明确的擅长的职责范围（推荐填写）+  性格设定（按需填写） + 背景知识（按需填写）+ 用户输入格式（按需填写）+ 行为指导（推荐填写） +  agent输出格式（按需填写） +  实际的例子-fewshot（推荐填写）
+如何写好Instruction？我们可以采取如下范式：
+明确的擅长的职责范围（推荐填写）+  性格设定（按需填写） + 背景知识（按需填写）+ 用户输入格式（按需填写）+ 行为指导（推荐填写） +  agent输出格式（按需填写） +  实际的例子-fewshot（推荐填写）
 
 根据上述范式定义有如下举例：
 ✅ 比较好的例子，如：
-你是Jerry的个人专属聊天机器人【智能体扮演的角色】。
 你擅长回答各类生活中遇见的专业问题与闲聊，你尤为擅长回答金融类问题【明确的擅长的职责范围】。
 你的性格开朗活泼【性格设定】。
 Jerry平日里对于财经类新闻特别感兴趣，同时比较关注宏观层面的政策【背景知识】。
-Jerry会用自然语言的形式与你进行问答交流【用户输入格式】。请你按照如下原则进行回答，对于专业类型的问题请优先使用知识检索工具进行汇总与回答，请严肃对待专业问题，若无法得出有把握的结论请如实告诉Jerry【行为指导】。
+Jerry会用自然语言的形式与你进行问答交流【用户输入格式】。
+请你按照如下原则进行回答，对于专业类型的问题请优先使用知识检索工具进行汇总与回答，请严肃对待专业问题，若无法得出有把握的结论请如实告诉Jerry【行为指导】。
 请你用自然语言的形式输出你的回答【agent输出格式】。
 下面是一个与Jerry交流的实际例子：Jerry问如何看待 2023年12月宏观数据? 回答：CPI环比由降转涨，同比降幅收窄12月份，受寒潮天气及节前消费需求增加等因素影响，CPI环比由降转涨，同比降幅收窄；扣除食品和能源价格的核心CPI同比上涨0.6%，涨幅保持稳定。PPI环比下降，同比降幅收窄12月份，受国际油价继续下行、部分工业品需求不足等因素影响，全国PPI环比下降，同比降幅收窄。【实际的例子-fewshot】
 （【】符号中的文字为说明，实际填写不需要提示）。
 
 ❌ 不太好的例子，如：
-你是一位健身教练，善于针对不同人群给出各类健身计划（给出的信息太少，给出的结果不确定性高，会比较泛泛而谈，往往不符合实际诉求） 
+你善于针对不同人群给出各类健身计划（给出的信息太少，给出的结果不确定性高，会比较泛泛而谈，往往不符合实际诉求） 
 ```
 
 ### 模型（LLM）
@@ -62,5 +65,8 @@ agentUniverse提供了大量已经验证有效的Pattern模式并提供对应沉
 ### 知识（Knowledge）
 可供Agent使用的知识。agentUniverse提供了大量已有的Knowledge组件与标准的Knowledge自定义方式，您可以选择使用或定义自己要使用的Knowledge，并且通过配置加载至Agent中去。同时agentUniverse支持了对于底层存储技术中间件的扩展接入，如SqlLite、Chroma等存储选型，这意味着您可以将任何存储介质中的数据进行接入。我们会在Knowledge章节中具体说明他们如何工作。
 
+## 记忆（Memory）
+可供Agent使用的记忆。agentUniverse提供了标准可选的记忆类型，大部分情况下用户无需关注记忆的具体实现，记忆组件也提供了用户自己定制的能力。我们会在Memory章节中具体说明他们如何工作。
+
 # 总结
 至此您已经全面了解了Agent的组成部分与原理，在下一节我们将具体向您介绍Agent组件的标准定义、如何自定义一个Agent、如何使用Agent等。
\ No newline at end of file
diff --git "a/docs/guidebook/zh/2_2_1_\346\231\272\350\203\275\344\275\223\345\210\233\345\273\272\344\270\216\344\275\277\347\224\250.md" "b/docs/guidebook/zh/2_2_1_\346\231\272\350\203\275\344\275\223\345\210\233\345\273\272\344\270\216\344\275\277\347\224\250.md"
new file mode 100644
index 00000000..e7bd533c
--- /dev/null
+++ "b/docs/guidebook/zh/2_2_1_\346\231\272\350\203\275\344\275\223\345\210\233\345\273\272\344\270\216\344\275\277\347\224\250.md"
@@ -0,0 +1,366 @@
+# 如何创建智能体
+您或许已经在[快速开始](1_3_快速开始.md)章节中了解如何快速创建一个智能体，亦或是在[智能体原理](2_2_1_智能体.md)掌握了智能体的重要组成部分，在本节我们会进一步详细说明如何创建智能体。
+
+根据agentUniverse领域组件的设计特性，创建一个智能体在创建过程中由2部分组成:
+* agent_xx.yaml
+* agent_xx.py
+
+其中`agent_xx.yaml`必须创建, 其包含了agent的Introduction、Target、Instruction、LLM等重要属性信息；`agent_xx.py`为按需创建，其包含了agent的特定行为并且支持了用户对于agent进行领域行为自定义注入。理解这一原理后，让我们具体看看该如何创建这两部分内容。
+
+## 创建智能体配置 - agent_xx.yaml
+我们将详细介绍配置中的各组成部分。
+
+### 设置智能体的基本信息
+**`info` - 智能体基本信息**
+* `name`:  智能体名称
+* `description`:  智能体描述
+
+### 设置智能体的全局设定
+**`profile` - 智能体全局设定**
+* `introduction`:  智能体角色介绍
+* `target`:  智能体目标
+* `instruction`: 智能体指令
+* `llm_model`: 智能体使用的LLM
+  * `name`: LLM 名称
+  * `model_name`: LLM 模型名  
+
+  您可以选择已有或接入任意的LLM，我们在本部分不展开说明，您可以关注LLM章节。
+
+### 设置智能体计划
+**`plan` - 智能体计划**
+* `planner` : 智能体计划器
+  * `name`: 计划器名称  
+  
+  您可以选择已有或接入任意的Planner，我们在本部分不展开说明，您可以关注Planner章节。
+
+### 设置智能体动作
+**`action` - 智能体动作**
+* `Tool` : 供智能体使用的工具
+  * tool_name_list，工具名称列表, 如:  
+    \- tool_name_a  
+    \- tool_name_b  
+    \- tool_name_c  
+
+  您可以选择已有或接入任意的Tool，我们在本部分不展开说明，您可以关注Tool章节。
+
+* `Knowledge` : 供智能体使用的知识
+  * knowledge_name_list，知识名称列表, 如:  
+    \- knowledge_name_a  
+    \- knowledge_name_b  
+    \- knowledge_name_c
+  
+  您可以选择已有或接入任意的Knowledge，我们在本部分不展开说明，您可以关注Knowledge章节。
+
+### 设置智能体记忆
+**`memory` - 智能体记忆**
+
+agent目前已经内置了默认记忆模式，您无需设置，同时memory是支持定制与类型选择的，我们会在近期的feature中开放这部分能力。
+
+### 设置组件元信息
+**`metadata` - 组件元信息**
+* `type` : 组件类型，'AGENT'
+* `module`: Agent实体包路径
+* `class`: Agent实体类名
+
+所有已经提供的Agent组件都将提供对应的`module`、`class`复制到该部分即可。该部分会将智能体的所有配置与其行为组成一个整体，若您扩展了智能体的行为，则需要按照实际路径填写这部分，我们将在后文中的 '从已有的智能体对象创建' 小节进一步说明。
+
+### 一个智能体配置的实际样例
+```yaml
+info:
+  name: 'demo_rag_agent'
+  description: 'demo rag agent'
+profile:
+  introduction: 你是一位精通信息分析的ai助手。
+  target: 你的目标是判断问题对应的答案是否提供了有价值的信息，并对问题的答案做出建议和评价。
+  instruction: |
+    你需要遵守的规则是:
+    1. 必须使用中文结合查询的背景信息结合你所拥有的知识回答用户提出的问题。
+    2. 结构化答案生成，必要时通过空行提升阅读体验。
+    3. 不采用背景信息中的错误信息。
+    4. 要考虑答案和问题的相关性，不做对问题没有帮助的回答。
+    5. 详尽回答问题，重点突出，不过多花哨词藻。
+    6. 不说模糊的推测。
+    7. 尽量多的使用数值类信息。
+
+    背景信息是:
+    {background}
+
+    开始!
+
+    需要回答的问题是: {input}
+  llm_model:
+    name: 'demo_llm'
+    model_name: 'gpt-4o'
+plan:
+  planner:
+    name: 'rag_planner'
+action:
+  tool:
+    - 'google_search_tool'
+#  knowledge:
+#    - 'knowledge_a'
+metadata:
+  type: 'AGENT'
+  module: 'sample_standard_app.app.core.agent.rag_agent_case.demo_rag_agent'
+  class: 'DemoRagAgent'
+```
+上述是一个实际的智能体配置的样例。除了上述介绍的标准配置项，细心的你可能发现了prompt中包含了类似`{background}`、`{input}`等变量，这是一个非常实用的prompt替换功能，我们在智能体领域行为定义中将解释这部分能力。
+
+您可以在我们的样例工程中的`sample_standard_app.app.core.agent`路径下更多的智能体配置yaml样例。
+
+除此之外agentuniverse不限制用户对agent yaml配置内容进行扩展，您可以根据自己的要求创建任何自定义配置key,但请注意不要与上述默认的配置关键字重名。
+
+## 创建智能体领域行为定义 - agent_xx.py
+在本部分您可以对任何智能体的行为进行编排与定制，当然如果您完全使用已有的Agent能力那么本部分并非必须。
+
+在本节我们将重点介绍常用的智能体领域行为定义与您可能在实际智能体领域行为定义过程中使用的常用技巧。
+
+### 创建Agent类对象
+创建对应的Agent类对象并继承agentUniverse框架Agent基础类 `Agent`;
+
+### 定制对应的智能体领域行为
+常用可定制的智能体行为如下。
+
+#### input_keys方法
+代表agent智能体运行流程中用户的入参key列表，需要由各自定义Agent类实现。
+
+例如：agent智能体运行只传入一个参数 question=xxx，则 input_keys 方法 return ['question']
+
+#### output_keys方法
+代表agent智能体运行结束时的出参key列表，需要由各自定义Agent类实现。
+
+例如：agent智能体运行输出结果包含response，则 output_keys 方法 return ['response']
+
+#### parse_input方法
+agent执行前的输入处理节点, agent的输入可以是自然语言或者json等结构化数据，您可以将任何用户输入的内容在该部分做处理，需要由各自定义Agent类实现。
+
+该部分拥有两个输入参数，如下:
+* `input_object`: 智能体输入原始数据
+  * 可通过 `input_object.get_data('input_key')` 方法获取input_object中的对于数据。  
+  
+    例如： 用户对智能体输入`question=xxx`， 我们可以通过`input_object.get_data('question')`获取用户当前的提问。
+
+* `agent_input`: 智能体输入处理后的数据, `dict类型`
+  * `agent_input`默认包含了如下关键参数key及数据
+    * `chat_history`: 包含了多轮会话数据
+    * `background`: 包含了背景知识
+    * `date`: 包含了当前的时间日期
+  * 将用户输入追加到`agent_input`中
+    * 例如： `agent_input['input'] = input_object.get_data('question')`
+  
+`parse_input`方法的输出对象一般使用`agent_input`。
+
+#### parse_result方法
+agent执行前的输出处理节点, agent的输出可以是自然语言或者json等结构化数据，您可以将任何需要输出的内容在该部分做处理，需要由各自定义Agent类实现。
+
+该部分拥有一个输入参数，如下:
+* `agent_result`: 智能体输出数据, `dict类型`  
+`parse_result`方法的输出对象一般使用`agent_result`
+
+#### execute方法
+该方法是agent最核心的执行流程入口， agent基础类默认实现了执行方法，用户也可以重写该方法定制任何agent的执行方法。
+
+##### 默认execute实现
+* agent基础类默认execute方法逻辑如下：
+  * 获取agent yaml配置中对应的planner名称
+  * 通过Planner管理器获取Planner实例
+  * 执行Planner实例invoke方法
+
+##### 自定义execute实现
+您也可以通过重写execute对于编排和定制agent的执行流程，重写execute会覆盖原有的agent基础类默认实现，这意味着agent将失去自动选择Planner的能力，若您需要您可以参考agent基础类默认实现加载对应的planner进行使用。
+
+以下是自定义execute的一个例子：
+```text
+def execute(self, input_object: InputObject, agent_input: dict) -> dict:
+    # Do anything, as exemplified below.
+    
+    # Invoke tool A to get data.
+    
+    # Analyze the data and determine whether it can answer the user's questions.
+    
+    # Organize language to answer questions.
+    
+    # Output the answer.
+    
+    return {'output': 'xxx'}
+```
+
+#### 获取智能体对象属性
+智能体对象通过`self.agent_model`可以智能体的属性，在智能体领域行为定义中您可以读取在智能体配置部分配置的所有属性。
+
+一个具体的例子如下:
+```text
+def execute(self, input_object: InputObject, agent_input: dict) -> dict:
+    """Execute agent instance.
+
+    Args:
+        input_object (InputObject): input parameters passed by the user.
+        agent_input (dict): agent input parsed from `input_object` by the user.
+
+    Returns:
+        dict: planner result generated by the planner execution.
+    """
+
+    planner_base: Planner = PlannerManager().get_instance_obj(self.agent_model.plan.get('planner').get('name'))
+    planner_result = planner_base.invoke(self.agent_model, agent_input, input_object)
+    return planner_result
+```
+在这段例子中通过`self.agent_model.plan`方式在执行方法内获取了智能体配置属性中的`plan`部分,进一步通过get方法最终获取了`planner`的实际名称。
+
+智能体的属性与领域行为都依赖于agentUniverse框架中Agent基础类，其路径为`agentuniverse.agent.agent.Agent`, 我们在智能体及相关领域对象章节中也会重点介绍相关的底层对象，若您关注底层技术实现可进一步参考对应的代码与文档；
+
+## 关注您定义的智能体所在的包路径
+通过上面的agent配置与领域定于部分，您已经掌握了agent创建的所有步骤；接下去我们将使用这些agent，在使用前请关注创建的agent是否在正确的包扫描路径内。
+
+在agentUniverse项目的config.toml中需要配置agent文件对应的package, 请再次确认您创建的文件所在的包路径是否在`CORE_PACKAGE`中`agent`路径或其子路径下。
+
+以示例工程中的配置为例，如下：
+```yaml
+[CORE_PACKAGE]
+# Scan and register agent components for all paths under this list, with priority over the default.
+agent = ['sample_standard_app.app.core.agent']
+```
+
+## agent创建的实用技巧
+### 自由定制与编排agent的执行过程
+在本文的 '创建智能体领域行为定义' 的 'execute方法' 部分中我们已经详细说明了如何自定义一个execute方法，这个方法在实践过程经常用来根据用户的诉求定制流程与注入SOP(Standard Operating Procedure)。
+
+### 如何通过用户的输入动态调整设置
+
+**方法一(推荐)： 通过标准的prompt模版变量替换方式**  
+
+我们在本文的 '一个智能体配置的实际样例' 小节中prompt中包含了类似`{background}`、`{input}`等变量，这是prompt变量模版替换功能，其目的是能够通过用户的输入去动态的影响prompt， 只需要在智能体配置的设置部分将文本使用`{变量名}`的方式进行定义，并在`parse_input`的`agent_input`中进行定义即可动态根据输入的部分替换对应的prompt。
+
+例如在样例agent中 `sample_standard_app.app.core.agent.rag_agent_case.demo_rag_agent.py` 有如下的`parse_input`方法。
+```text
+def parse_input(self, input_object: InputObject, agent_input: dict) -> dict:
+    agent_input['input'] = input_object.get_data('input')
+    return agent_input
+```
+在其对应agent设置`sample_standard_app.app.core.agent.rag_agent_case.demo_rag_agent.yaml`中的`instruction`部分我们可以看到如下配置:
+```text
+instruction: |
+    你需要遵守的规则是:
+    1. 必须使用中文结合查询的背景信息结合你所拥有的知识回答用户提出的问题。
+    2. 结构化答案生成，必要时通过空行提升阅读体验。
+    3. 不采用背景信息中的错误信息。
+    4. 要考虑答案和问题的相关性，不做对问题没有帮助的回答。
+    5. 详尽回答问题，重点突出，不过多花哨词藻。
+    6. 不说模糊的推测。
+    7. 尽量多的使用数值类信息。
+
+    背景信息是:
+    {background}
+
+    开始!
+
+    需要回答的问题是: {input}
+```
+
+通过这个过程我们可以将每次的输入与记忆或背景知识及任何你关注的信息通过该方法带入agent与LLM的交互中。
+
+**方法二： 在parse_input方法或execute方法中调整prompt**
+通过agent的`parse_input`方法或`execute`方法我们可以对agent做数据或行为上的定制，同时结合`self.agent_model`中的get方法与智能体输入参数`input_object`，这意味着您可以通过这些定制方法将你的任意设置内容进行修改。
+
+### 从已有的智能体对象创建智能体
+在实际的应用创建过程中，我们可能存在很多同类型的智能体，例如我们想创建许多检索增强RAG(Retrieval Augmented Generation)类型的智能体，运用于不同的问答场景中。分析他们的相同与不同点我们不难发现对于大部分RAG类型的智能体，他们具有如下共性与差异。
+* 主要的相同点：他们往往都需要同时检索多种知识
+* 主要的不同点： 不同场景的RAG智能体需要对应检索不同的工具，可能拥有不同的智能体全局设置
+
+进一步分析，我们通过相同的领域行为与差异化的属性配置可以实现这一目标。这也就是为什么agent的创建过程中配置设置yaml是必须的, 但是领域行为定制是按实际需求的。
+
+幸运的是我们拥有非常多有效的智能体类型, 并且他们仍在不断扩充。如这个case所述，结合agent领域组件的设置过程，我们仅需要设置非常多不同的类型的agent配置设置yaml，并且在agent的组件元信息中通过设置`metadata`完成这一目标。
+
+例如：  
+**金融类RAG agent设置**
+```yaml
+info:
+  name: 'financial_RAG_agent'
+  description: 'demo financial rag agent'
+profile:
+  introduction:  Demo introduction, such as you are a financial RAG agent.
+  target: Demo target, such as use financial tools to retrieve and enhance answer performance.
+  instruction: |
+    demo instruction, xxx, {input}
+  llm_model:
+    name: 'demo_llm'
+    model_name: 'gpt-4o'
+plan:
+  planner:
+    name: 'rag_planner'
+action:
+  tool:
+    - 'financial_data_tool'
+metadata:
+  type: 'AGENT'
+  module: 'agentuniverse.agent.default.rag_agent.rag_agent'
+  class: 'RagAgent'
+```
+
+**科技类RAG agent设置**
+```yaml
+info:
+  name: 'tech_RAG_agent'
+  description: 'demo tech rag agent'
+profile:
+  introduction:  Demo introduction, such as you are a tech RAG agent.
+  target: Demo target, such as use tech tools to retrieve and enhance answer performance.
+  instruction: |
+    demo instruction, xxx, {input}
+  llm_model:
+    name: 'demo_llm'
+    model_name: 'gpt-4o'
+plan:
+  planner:
+    name: 'rag_planner'
+action:
+  tool:
+    - 'tech_data_tool'
+metadata:
+  type: 'AGENT'
+  module: 'agentuniverse.agent.default.rag_agent.rag_agent'
+  class: 'RagAgent'
+```
+
+您可以在本文的 '了解更多已有的智能体' 部分查询更多的agent元信息并了解他们的作用。
+
+# 如何使用智能体
+在agentUniverse中所有agent实体都由全局agent管理器进行管理，在任何框架执行过程中如果您需要使用智能体可以通过agent管理器。同时通过框架的服务化能力，您可以将agent快速服务化并通过标准的http或rpc协议对其进行网络调用。
+
+## 方案一: 使用agent管理器
+通过agent管理器中的`get_instance_obj('agent_name_xxx')` 方法可以获取对应名称的agent实例，同时通过agent自身的`run(input='xxx')`方法使用agent，下面的test类中的`test_rag_agent(self)`方法就是使用该方式对于agent进行了调试。
+```python
+import unittest
+
+from agentuniverse.agent.agent import Agent
+from agentuniverse.agent.agent_manager import AgentManager
+from agentuniverse.agent.output_object import OutputObject
+from agentuniverse.base.agentuniverse import AgentUniverse
+
+
+class RagAgentTest(unittest.TestCase):
+    """
+    Test cases for the rag agent
+    """
+
+    def setUp(self) -> None:
+        AgentUniverse().start(config_path='../../config/config.toml')
+
+    def test_rag_agent(self):
+        """Test demo rag agent."""
+        instance: Agent = AgentManager().get_instance_obj('demo_rag_agent')
+        output_object: OutputObject = instance.run(input='英伟达股票大涨原因是什么？')
+        print(output_object.get_data('output'))
+
+if __name__ == '__main__':
+    unittest.main()
+```
+
+## 方案二: 使用agent_serve服务化能力
+agentUniverse提供多套标准的web serve能力, 同时提供标准的http与rpc协议。您可以进一步关注文档[服务注册与使用](2_4_1_服务注册与使用.md)与[Web_Server](2_4_1_Web_Server.md)部分。
+
+# 了解更多已有的智能体
+框架提供的智能体在`agentuniverse.agent.default`包路径下，您可以进一步查看对应代码或在我们的扩展组件介绍部分进一步了解他们。
+
+# 总结
+至此您已经掌握了智能体创建与使用的全部内容，让我们用这些内容去定制专属agent吧。
\ No newline at end of file
diff --git "a/docs/guidebook/zh/2_2_1_\346\231\272\350\203\275\344\275\223\345\217\212\347\233\270\345\205\263\351\242\206\345\237\237\345\257\271\350\261\241.md" "b/docs/guidebook/zh/2_2_1_\346\231\272\350\203\275\344\275\223\345\217\212\347\233\270\345\205\263\351\242\206\345\237\237\345\257\271\350\261\241.md"
new file mode 100644
index 00000000..6ccb4056
--- /dev/null
+++ "b/docs/guidebook/zh/2_2_1_\346\231\272\350\203\275\344\275\223\345\217\212\347\233\270\345\205\263\351\242\206\345\237\237\345\257\271\350\261\241.md"
@@ -0,0 +1,17 @@
+# 智能体与相关领域对象
+在本章节我们会重点列出智能体与相关的核心领域对象, 我们省略了其对应的代码部分，若您希望进一步了解请阅读对应的[API参考部分](4_1_API参考.md)。
+
+## Agent基础类
+包路径：`agentuniverse.agent.agent.Agent`
+
+## Agent管理器
+包路径：`agentuniverse.agent.agent_manager.AgentManager`
+
+## Agent属性类
+包路径：`agentuniverse.agent.agent_model.AgentModel`
+
+## 输入对象
+包路径：`agentuniverse.agent.input_object.InputObject`
+
+## 输出对象
+包路径：`agentuniverse.agent.output_object.OutputObject`
diff --git "a/docs/guidebook/zh/5_1_2_K8S\351\203\250\347\275\262.md" "b/docs/guidebook/zh/5_1_2_K8S\351\203\250\347\275\262.md"
new file mode 100644
index 00000000..949e3bdd
--- /dev/null
+++ "b/docs/guidebook/zh/5_1_2_K8S\351\203\250\347\275\262.md"
@@ -0,0 +1,108 @@
+# K8S集群部署
+AgentUniverse 提供标准的工作环境镜像，并且支持在 Kubernetes (K8S) 集群上容器化部署。本指南将指导您如何利用这些工作环境镜像，在 K8S 上部署和搭建集群。
+
+官方K8S使用文档：[Kubernetes Setup Documentation](https://kubernetes.io/docs/setup/)
+
+## 1. 资源配置
+
+首先，您需要配置必要的资源文件。以下是使用 YAML 配置文件定义所需的 Namespace、Deployment 和 Service 资源的示例：
+
+```yaml
+apiVersion: v1
+kind: Namespace
+metadata:
+  name: agent-namespace
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: agentuniverse-deployment
+  namespace: agent-namespace
+  labels:
+    app: agentuniverse
+spec:
+  replicas: 3
+  selector:
+    matchLabels:
+      app: agentuniverse
+  template:
+    metadata:
+      labels:
+        app: agentuniverse
+    spec:
+      containers:
+      - name: agentuniverse-container
+        image: registry.cn-hangzhou.aliyuncs.com/agent_universe/agent_universe:0.0.5_centos8_beta
+        ports:
+        - containerPort: 8888
+        command: ["/bin/bash", "-c"]
+        args: ["git clone git@github.com:alipay/agentUniverse.git; mv agentUniverse/sample_standard_app /usr/local/etc/workspace/project; /bin/bash --login /usr/local/etc/workspace/shell/start.sh"]
+        # Uncomment and replace "XXX" with your key to configure the agent
+        # env:
+        # - name: OPENAI_API_KEY
+        #   value: "XXX"
+---
+apiVersion: v1
+kind: Service
+metadata:
+  name: agentuniverse-service
+  namespace: agent-namespace
+spec:
+  selector:
+    app: agentuniverse
+  ports:
+  - protocol: TCP
+    port: 9999
+    targetPort: 8888
+```
+
+### 1.1 AgentUniverse项目环境变量设置
+
+#### 方式1（推荐）
+
+在资源配置文件中，取消注释env部分，并将`value`替换为您的密钥。对于进一步的安全性要求，推荐使用K8S官方推荐的方式，比如ConfigMap。参考 [ConfigMap Configuration Documentation](https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/)。
+
+#### 方式2
+
+请参考配置文件开始部分的描述: [快速开始指南](https://github.com/alipay/agentUniverse/blob/master/docs/guidebook/zh/1_3_快速开始.md)
+
+## 2. 构建资源
+
+创建并应用上述配置文件：
+
+```
+1kubectl apply -f agentuniverse.yaml
+```
+
+## 3. 验证资源
+
+确认所有资源是否正确部署：
+
+```
+1kubectl get all -n agent-namespace
+```
+![资源部署情况](../_picture/k8s_resource.png)
+## 4. 从集群内部访问AgentUniverse 服务
+
+要从集群内部访问 AgentUniverse 服务，请使用以下命令行示例：
+
+```
+1kubectl exec -it [Pod名称] -n agent-namespace -- curl http://agentuniverse-service:9999
+```
+
+### 4.1 示例
+
+#### 4.1.1 联通性测试
+
+```
+kubectl exec -it agentuniverse-deployment-55cfd778d-g7d9d -n agent-namespace -- curl http://agentuniverse-service:9999/echo
+```
+
+![连通性测试](../_picture/k8s_hello.png)
+#### 4.1.2 问答测试
+
+```
+kubectl exec -it agentuniverse-deployment-55cfd778d-g7d9d -n agent-namespace -- curl -X POST -H "Content-Type: application/json" -d '{"service_id":"demo_service","params":{"input":"(18+3-5)/2*4=?"}}' http://agentuniverse-service:9999/service_run
+```
+
+![问答测试](../_picture/k8s_question.png)
\ No newline at end of file
diff --git "a/docs/guidebook/zh/8_1_\350\201\224\347\263\273\346\210\221\344\273\254.md" "b/docs/guidebook/zh/6_1_\350\201\224\347\263\273\346\210\221\344\273\254.md"
similarity index 100%
rename from "docs/guidebook/zh/8_1_\350\201\224\347\263\273\346\210\221\344\273\254.md"
rename to "docs/guidebook/zh/6_1_\350\201\224\347\263\273\346\210\221\344\273\254.md"
diff --git a/pyproject.toml b/pyproject.toml
index b58b3854..5bb51f71 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
 [tool.poetry]
 name = "agentUniverse"
-version = "0.0.6_beta"
+version = "0.0.6"
 description = "agentUniverse is a framework for developing applications powered by multi-agent base on large language model."
 
 authors = ["AntGroup <jerry.zzw@antgroup.com>"]
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 c2fd4f11..b5189daf 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
@@ -5,7 +5,7 @@ profile:
   prompt_version: demo_expressing_agent.cn
   llm_model:
     name: demo_llm
-    model_name: gpt-4-turbo
+    model_name: gpt-4o
     temperature: 0.2
     prompt_processor:
       type: stuff
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 365e7065..b3f5f39a 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
@@ -5,7 +5,7 @@ profile:
   prompt_version: demo_planning_agent.cn
   llm_model:
     name: 'demo_llm'
-    model_name: 'gpt-4'
+    model_name: 'gpt-4o'
     temperature: 0.5
 plan:
   planner:
diff --git a/sample_standard_app/app/core/agent/rag_agent_case/demo_multimodal_agent.yaml b/sample_standard_app/app/core/agent/rag_agent_case/demo_multimodal_agent.yaml
new file mode 100644
index 00000000..53dbc423
--- /dev/null
+++ b/sample_standard_app/app/core/agent/rag_agent_case/demo_multimodal_agent.yaml
@@ -0,0 +1,22 @@
+info:
+  name: 'demo_multimodal_agent'
+  description: 'demo multimodal agent'
+profile:
+  introduction: You are the ai assistant.
+  target: Your target is to answer the user's questions
+  instruction: |
+    Begin!
+
+    The question that needs to be answered is: {input}
+  llm_model:
+    name: 'demo_llm'
+    model_name: 'gpt-4o'
+plan:
+  planner:
+    name: 'rag_planner'
+action:
+  tool:
+metadata:
+  type: 'AGENT'
+  module: 'sample_standard_app.app.core.agent.rag_agent_case.demo_rag_agent'
+  class: 'DemoRagAgent'
\ No newline at end of file
diff --git a/sample_standard_app/app/core/agent/rag_agent_case/demo_rag_agent.py b/sample_standard_app/app/core/agent/rag_agent_case/demo_rag_agent.py
index 677caab0..78786f15 100644
--- a/sample_standard_app/app/core/agent/rag_agent_case/demo_rag_agent.py
+++ b/sample_standard_app/app/core/agent/rag_agent_case/demo_rag_agent.py
@@ -16,10 +16,9 @@ def input_keys(self) -> list[str]:
     def output_keys(self) -> list[str]:
         return ['output']
 
-    def parse_input(self, input_object: InputObject, planner_input: dict) -> dict:
-        input = input_object.get_data('input')
-        planner_input['input'] = input
-        return planner_input
+    def parse_input(self, input_object: InputObject, agent_input: dict) -> dict:
+        agent_input['input'] = input_object.get_data('input')
+        return agent_input
 
     def parse_result(self, planner_result: dict) -> dict:
         return planner_result
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 bb8be0f4..6841d584 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
@@ -22,7 +22,7 @@ profile:
     需要回答的问题是: {input}
   llm_model:
     name: 'demo_llm'
-    model_name: 'gpt-4-turbo'
+    model_name: 'gpt-4o'
 plan:
   planner:
     name: 'rag_planner'
diff --git a/sample_standard_app/app/core/prompt/planning_agent_cn.yaml b/sample_standard_app/app/core/prompt/planning_agent_cn.yaml
index b2560fa1..38179542 100644
--- a/sample_standard_app/app/core/prompt/planning_agent_cn.yaml
+++ b/sample_standard_app/app/core/prompt/planning_agent_cn.yaml
@@ -15,7 +15,7 @@ instruction: |
   开始!
   今天的日期是: {date}
 
-  输出必须是按照以下格式化的Json代码片段，thought字段代表拆解问题的思考过程，framework字段代表拆解后的子问题列表。
+  输出必须是按照以下格式化的Json代码片段，不加额外的json标识，thought字段代表拆解问题的思考过程，framework字段代表拆解后的子问题列表。
   {{
       "thought": string,
       "framework": list


Test patch:
diff --git a/sample_standard_app/app/test/test_multimodal_agent.py b/sample_standard_app/app/test/test_multimodal_agent.py
new file mode 100644
index 00000000..ce213cbc
--- /dev/null
+++ b/sample_standard_app/app/test/test_multimodal_agent.py
@@ -0,0 +1,37 @@
+# !/usr/bin/env python3
+# -*- coding:utf-8 -*-
+
+# @Time    : 2024/5/15 17:37
+# @Author  : wangchongshi
+# @Email   : wangchongshi.wcs@antgroup.com
+# @FileName: test_multimodal_agent.py
+import unittest
+
+from agentuniverse.agent.agent import Agent
+from agentuniverse.agent.agent_manager import AgentManager
+from agentuniverse.agent.output_object import OutputObject
+from agentuniverse.base.agentuniverse import AgentUniverse
+
+
+class MultimodalAgentTest(unittest.TestCase):
+    """
+    Test cases for the multimodal agent
+    """
+
+    def setUp(self) -> None:
+        AgentUniverse().start(config_path='../../config/config.toml')
+
+    def test_multimodal_agent(self):
+        """Test demo multimodal agent."""
+        instance: Agent = AgentManager().get_instance_obj('demo_multimodal_agent')
+
+        output_object: OutputObject = instance.run(input='Which city is the view in the picture?',
+                                                   image_urls=[
+                                                       'https://cdn.pixabay.com/photo/2016/03/27/00/01/australia-1281935_1280.jpg'])
+        res_info = f"\nMultimodal agent execution result is :\n"
+        res_info += output_object.get_data('output')
+        print(res_info)
+
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/tests/test_agentuniverse/unit/llm/test_llm.py b/tests/test_agentuniverse/unit/llm/test_llm.py
index 61e96c1d..4d2fa99e 100644
--- a/tests/test_agentuniverse/unit/llm/test_llm.py
+++ b/tests/test_agentuniverse/unit/llm/test_llm.py
@@ -18,7 +18,7 @@ class LLMTest(unittest.TestCase):
     """
 
     def setUp(self) -> None:
-        self.llm = OpenAILLM(model_name='gpt-4')
+        self.llm = OpenAILLM(model_name='gpt-4o')
 
     def test_call(self) -> None:
         messages = [
@@ -27,7 +27,7 @@ def test_call(self) -> None:
                 "content": "hi, please introduce yourself",
             }
         ]
-        output = self.llm.call(messages=messages,streaming=False)
+        output = self.llm.call(messages=messages, streaming=False)
         print(output.__str__())
 
     def test_acall(self) -> None:
@@ -37,7 +37,7 @@ def test_acall(self) -> None:
                 "content": "hi, please introduce yourself",
             }
         ]
-        output = asyncio.run(self.llm.acall(messages=messages,streaming=False))
+        output = asyncio.run(self.llm.acall(messages=messages, streaming=False))
         print(output.__str__())
 
     def test_call_stream(self):
@@ -74,6 +74,22 @@ def test_as_langchain(self):
         res = llm_chain.predict(input='hello')
         print(res)
 
+    def test_gpt_4o_image(self):
+        response = self.llm.call(
+            messages=[
+                {"role": "system",
+                 "content": "You are a helpful assistant that responds in Markdown. Help me with my math homework!"},
+                {"role": "user", "content": [
+                    {"type": "text", "text": "What's the area of the triangle?"},
+                    {"type": "image_url", "image_url": {
+                        "url": "https://upload.wikimedia.org/wikipedia/commons/e/e2/The_Algebra_of_Mohammed_Ben_Musa_-_page_82b.png"}
+                     }
+                ]}
+            ],
+            temperature=0.0,
+        )
+        print(response.__str__())
+
 
 if __name__ == '__main__':
     unittest.main()