Repository: antgroup/agentUniverse (language: python)

Issue:
compress pictures



Discussion / hints:

Fix patch:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 3ee1b273..7ec09f51 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -24,6 +24,21 @@ Note - Additional remarks regarding the version.
 ***************************************************
 
 # Version Update History
+## [0.0.9] - 2024-06-14
+### Added
+- Added standard integration for Claude and Ollama LLM components
+- Added new Qwen embedding module
+- Added default agents for ReAct-Type and NL2API-Type
+
+### Note
+- Added new use cases
+  - RAG-Type Agent Examples: Legal Consultation Agent
+  - ReAct-Type Agent Examples: Python Code Generation and Execution Agent
+  - Multi-Agent: Discussion Group Based on Multi-Turn Multi-Agent Mode
+
+  For more details, please refer to the use case section in the user documentation.
+- Some code optimizations and documentation updates.
+
 ## [0.0.8] - 2024-06-06
 ### Added
 - Introduced a new monitor module
@@ -31,7 +46,7 @@ Note - Additional remarks regarding the version.
 - Added webserver post_fork functionality
   - Provides multi-node process intervention capabilities after starting the webserver in agentUniverse
 - Introduced SQLDB_WRAPPER wrapper class, offering typical database connection methods
-  - Through the SQLDB_WRAPPER wrapper class, you can conveniently connect to various databases and storage technologies including SQLite, MySQL, Oracle, PostgreSQL, and others
+  - Through the SQLDB_WRAPPER wrapper class, you can conveniently connect to various databases and storage technologies including SQLServer, MySQL, Oracle, PostgreSQL, SQLite and others
 - Added connection support for Milvus vector database component
 
 For more usage of the above features, please pay attention to the agentUniverse guidebook.
diff --git a/CHANGELOG_zh.md b/CHANGELOG_zh.md
index 974374c8..600479be 100644
--- a/CHANGELOG_zh.md
+++ b/CHANGELOG_zh.md
@@ -24,6 +24,21 @@ Note - 对于版本的额外说明。
 ***************************************************
 
 # 版本更新记录
+## [0.0.9] - 2024-06-14
+### Added
+- LLM组件新增claude、ollama标准接入
+- 新增qwen embedding模块
+- 新增ReAct、nl2api默认agent
+
+### Note
+- 新增使用案例
+  - RAG类Agent案例-法律咨询Agent
+  - ReAct类Agent案例-Python代码生成与执行Agent
+  - 多智能体案例-基于多轮多Agent的讨论小组
+
+  详情请看用户文档案例部分。
+- 部分代码优化与文档更新
+
 ## [0.0.8] - 2024-06-06
 ### Added
 - 新增monitor模块
@@ -31,7 +46,7 @@ Note - 对于版本的额外说明。
 - 新增webserver post_fork功能
   - 开放agentUniverse中webserver启动后的多节点流程干预功能
 - 新增SQLDB_WRAPPER包装类，提供典型数据库连接方式
-  - 通过SQLDB_WRAPPER包装类您可以非常方便的连接如SQLite、MySQL、Oracle、PostgreSQL、SQLite等几十种数据库与存储技术组件。
+  - 通过SQLDB_WRAPPER包装类您可以非常方便的连接如SQLServer、MySQL、Oracle、PostgreSQL、SQLite等几十种数据库与存储技术组件。
 - 新增milvus向量数据库组件连接
 
 上述功能更多用法请关注agentUniverse指导手册部分。
diff --git a/README.md b/README.md
index 4823b33b..ee6656b2 100644
--- a/README.md
+++ b/README.md
@@ -1,11 +1,11 @@
 # agentUniverse
 ****************************************
-Language version: [English](./README.md) | [中文](./README_zh.md)
+Language version: [English](./README.md) | [中文](./README_zh.md) | [日本語](./README_jp.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.8-blue?logo=pypi)](https://pypi.org/project/agentUniverse/)
+[![Static Badge](https://img.shields.io/badge/pypi-v0.0.9-blue?logo=pypi)](https://pypi.org/project/agentUniverse/)
 
 ![](docs/guidebook/_picture/logo_bar.jpg)
 ****************************************
@@ -44,6 +44,11 @@ We will show you how to:
 * Quickly serve the agent
 For details, please read [Quick Start](docs/guidebook/en/1_3_Quick_Start.md).
 
+## Use Cases
+[Legal Consultation Agent](./docs/guidebook/en/7_1_1_Legal_Consultation_Case.md)
+[Python Code Generation and Execution Agent](./docs/guidebook/en/7_1_1_Python_Auto_Runner.md)
+[Discussion Group Based on Multi-Turn Multi-Agent Mode](./docs/guidebook/en/6_2_1_Discussion_Group.md)
+
 ## Guidebook
 For more detailed information, please refer to the [Guidebook](docs/guidebook/en/0_index.md).
 
@@ -58,4 +63,4 @@ For more detailed information, please refer to the [Guidebook](docs/guidebook/en
 * Discord: https://discord.gg/VfhEvJzQ
 * WeChat Official Account: agentUniverse智多星
 * DingTalk Group:
-![](./docs/guidebook/_picture/dingtalk_util20250429.png)
\ No newline at end of file
+![](./docs/guidebook/_picture/dingtalk_util20250429.png)
diff --git a/README_jp.md b/README_jp.md
new file mode 100644
index 00000000..ec284e38
--- /dev/null
+++ b/README_jp.md
@@ -0,0 +1,65 @@
+# agentUniverse
+****************************************
+言語バージョン: [英語](./README.md) | [中国語](./README_zh.md) | [日本語](./README_jp.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.9-blue?logo=pypi)](https://pypi.org/project/agentUniverse/)
+
+![](docs/guidebook/_picture/logo_bar.jpg)
+****************************************
+
+## 概要
+agentUniverseは、大規模言語モデルに基づくマルチエージェントアプリケーションを開発するためのフレームワークです。単一エージェントの構築に必要なすべての基本コンポーネントと、マルチエージェントのコラボレーションメカニズムを提供します。これにより、開発者はマルチエージェントアプリケーションを簡単に構築し、異なる技術およびビジネス分野からのパターンプラクティスを共有することができます。
+
+フレームワークには、実際のビジネスシナリオで効果が証明されたいくつかのプリインストールされたマルチエージェントコラボレーションパターンが含まれており、今後も豊富になる予定です。現在リリース予定のパターンには以下が含まれます：
+
+- PEERパターン：
+このパターンは、Plan（計画）、Execute（実行）、Express（表現）、Review（レビュー）の4つの異なるエージェントの役割を利用して、複雑なタスクを多段階に分解し、順次実行します。また、評価フィードバックに基づいて自律的な反復を行い、推論および分析タスクのパフォーマンスを向上させます。
+
+- DOEパターン：
+このパターンは、Data-fining（データ精製）、Opinion-inject（意見注入）、Express（表現）の3つのエージェントで構成され、データ集約型および高計算精度のタスクを解決し、事前に収集および構造化された専門家の意見と組み合わせることで、最終結果を生成します。
+
+これからもっと多くのパターンが登場します...
+
+![](docs/guidebook/_picture/agent_universe_framework_resize.jpg)
+
+## agentUniverseサンプルプロジェクト
+[agentUniverse サンプルプロジェクト](sample_standard_app/README.md)
+
+## クイックインストール
+pipを使用：
+```shell
+pip install agentUniverse
+```
+
+## クイックスタート
+以下の内容をご紹介します：
+* 環境とアプリケーションプロジェクトの準備
+* シンプルなエージェントの構築
+* パターンコンポーネントを使用してマルチエージェントのコラボレーションを完了する
+* エージェントのパフォーマンスをテストおよび最適化する
+* エージェントを迅速に提供する
+詳細は、[クイックスタート](docs/guidebook/en/1_3_Quick_Start.md)をご覧ください。
+
+## 使用ケース
+[法律相談Agent](./docs/guidebook/en/7_1_1_Legal_Consultation_Case.md)
+[Pythonコード生成と実行Agent](./docs/guidebook/en/7_1_1_Python_Auto_Runner.md)
+[多回多Agentによるディスカッショングループ](./docs/guidebook/en/6_2_1_Discussion_Group.md)
+
+## ガイドブック
+詳細情報については、[ガイドブック](docs/guidebook/en/0_index.md)を参照してください。
+
+## APIリファレンス
+[readthedocs](https://agentuniverse.readthedocs.io/en/latest/)
+
+## お問い合わせ
+* github: https://github.com/alipay/agentUniverse
+* gitee: https://gitee.com/agentUniverse/agentUniverse
+* gitcode: https://gitcode.com/agentUniverse
+* Stack Overflow: https://stackoverflowteams.com/c/agentuniverse/questions
+* Discord: https://discord.gg/VfhEvJzQ
+* WeChat公式アカウント: agentUniverse智多星
+* DingTalkグループ:
+![](./docs/guidebook/_picture/dingtalk_util20250429.png)
diff --git a/README_zh.md b/README_zh.md
index 0bb45fb1..d35db732 100644
--- a/README_zh.md
+++ b/README_zh.md
@@ -1,11 +1,11 @@
 # agentUniverse
 ****************************************
-语言版本: [English](./README.md) | [中文](./README_zh.md)
+语言版本: [English](./README.md) | [中文](./README_zh.md) | [日本語](./README_jp.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.8-blue?logo=pypi)](https://pypi.org/project/agentUniverse/)
+[![Static Badge](https://img.shields.io/badge/pypi-v0.0.9-blue?logo=pypi)](https://pypi.org/project/agentUniverse/)
 
 ![](docs/guidebook/_picture/logo_bar.jpg)
 ****************************************
@@ -47,6 +47,11 @@ pip install agentUniverse
 
 详情请阅读[快速开始](docs/guidebook/zh/1_3_%E5%BF%AB%E9%80%9F%E5%BC%80%E5%A7%8B.md) 。
 
+## 使用案例
+[法律咨询Agent](./docs/guidebook/zh/7_1_1_法律咨询案例.md)
+[Python代码生成与执行Agent](./docs/guidebook/zh/7_1_1_Python自动执行案例.md)
+[基于多轮多Agent的讨论小组](./docs/guidebook/zh/6_2_1_讨论组.md)
+
 ## 用户指南
 更多详细信息，请参阅[指南](docs/guidebook/zh/0_%E7%9B%AE%E5%BD%95.md) 。
 
@@ -61,4 +66,4 @@ pip install agentUniverse
 * Discord: https://discord.gg/VfhEvJzQ
 * 微信公众号: agentUniverse智多星
 * 钉钉答疑群:
-![](./docs/guidebook/_picture/dingtalk_util20250429.png)
\ No newline at end of file
+![](./docs/guidebook/_picture/dingtalk_util20250429.png)
diff --git a/agentuniverse/agent/action/knowledge/embedding/dashscope_embedding.py b/agentuniverse/agent/action/knowledge/embedding/dashscope_embedding.py
new file mode 100644
index 00000000..7cab3b0b
--- /dev/null
+++ b/agentuniverse/agent/action/knowledge/embedding/dashscope_embedding.py
@@ -0,0 +1,156 @@
+# !/usr/bin/env python3
+# -*- coding:utf-8 -*-
+
+# @Time    : 2024/6/12 11:43
+# @Author  : wangchongshi
+# @Email   : wangchongshi.wcs@antgroup.com
+# @FileName: dashscope_embedding.py
+import aiohttp
+import requests
+from typing import List, Generator, Optional
+import json
+
+from agentuniverse.base.util.env_util import get_from_env
+from agentuniverse.agent.action.knowledge.embedding.embedding import Embedding
+
+# Dashscope support max 25 string in one batch, each string max tokens is 2048.
+DASHSCOPE_MAX_BATCH_SIZE = 25
+DASHSCOPE_EMBEDDING_URL = "https://dashscope.aliyuncs.com/api/v1/services/embeddings/text-embedding/text-embedding"
+
+
+def batched(inputs: List,
+            batch_size: int = DASHSCOPE_MAX_BATCH_SIZE) -> Generator[List, None, None]:
+    # Split input string list, due to dashscope support 25 strings in one call.
+    for i in range(0, len(inputs), batch_size):
+        yield inputs[i:i + batch_size]
+
+
+class DashscopeEmbedding(Embedding):
+    """The Dashscope embedding class."""
+    dashscope_api_key: Optional[str] = None
+
+    def __init__(self, **kwargs):
+        """Initialize the dashscope embedding class, need dashscope api key."""
+        super().__init__(**kwargs)
+        self.dashscope_api_key = get_from_env("DASHSCOPE_API_KEY")
+        if not self.dashscope_api_key:
+            raise Exception("No DASHSCOPE_API_KEY in your environment.")
+
+
+    def get_embeddings(self, texts: List[str]) -> List[List[float]]:
+        """
+        Retrieve text embeddings for a list of input texts.
+
+        This function interfaces with the DashScope embedding API to obtain
+        embeddings for a batch of input texts. It handles batching of input texts
+        to ensure efficient API calls. Each text is processed using the specified
+        embedding model.
+
+        Args:
+            texts (List[str]): A list of input texts to be embedded.
+
+        Returns:
+            List[List[float]]: A list of embeddings corresponding to the input texts.
+
+        Raises:
+            Exception: If the API call to DashScope fails, an exception is raised with
+                       the respective error code and message.
+        """
+        def post(post_params):
+            response = requests.post(
+                url=DASHSCOPE_EMBEDDING_URL,
+                headers={
+                    "Content-Type": "application/json",
+                    "Authorization": f"Bearer {self.dashscope_api_key}"
+                },
+                data=json.dumps(post_params, ensure_ascii=False).encode(
+                    "utf-8"),
+                timeout=120
+            )
+            resp_json = response.json()
+            return resp_json
+
+        result = []
+        post_params = {
+            "model": self.embedding_model_name,
+            "input": {},
+            "parameters": {
+                "text_type": "query"
+            }
+        }
+
+        for batch in batched(texts):
+            post_params["input"]["texts"] = batch
+            resp_json: dict = post(post_params)
+            data = resp_json.get("output")
+            if data:
+                data = data["embeddings"]
+                batch_result = [d['embedding'] for d in data if 'embedding' in d]
+                result += batch_result
+            else:
+                error_code = resp_json.get("code", "")
+                error_message = resp_json.get("message", "")
+                raise Exception(f"Failed to call dashscope embedding api, "
+                                f"error code:{error_code}, "
+                                f"error message:{error_message}")
+        return result
+
+    async def async_get_embeddings(self, texts: List[str]) -> List[List[float]]:
+        """
+        Async version of get_embeddings.
+
+        This function interfaces with the DashScope embedding API to obtain
+        embeddings for a batch of input texts. It handles batching of input texts
+        to ensure efficient API calls. Each text is processed using the specified
+        embedding model.
+
+        Args:
+            texts (List[str]): A list of input texts to be embedded.
+
+        Returns:
+            List[List[float]]: A list of embeddings corresponding to the input texts.
+
+        Raises:
+            Exception: If the API call to DashScope fails, an exception is raised with
+                       the respective error code and message.
+        """
+        async def async_post(post_params):
+            async with aiohttp.ClientSession() as session:
+                async with await session.post(
+                        url=DASHSCOPE_EMBEDDING_URL,
+                        headers={
+                            "Content-Type": "application/json",
+                            "Authorization": f"Bearer {self.dashscope_api_key}"
+                        },
+                        data=json.dumps(post_params, ensure_ascii=False).encode(
+                            "utf-8"),
+                        timeout=120,
+                ) as resp:
+                    resp_json = await resp.json()
+            return resp_json
+
+        result = []
+        post_params = {
+            "model": self.embedding_model_name,
+            "input": {},
+            "parameters": {
+                "text_type": "query"
+            }
+        }
+
+        for batch in batched(texts):
+            post_params["input"]["texts"] = batch
+            resp_json: dict = await async_post(post_params)
+            data = resp_json.get("output")
+            if data:
+                data = data["embeddings"]
+                batch_result = [d['embedding'] for d in data if
+                                'embedding' in d]
+                result += batch_result
+            else:
+                error_code = resp_json.get("code", "")
+                error_message = resp_json.get("message", "")
+                raise Exception(f"Failed to call dashscope embedding api, "
+                                f"error code:{error_code}, "
+                                f"error message:{error_message}")
+        return result
\ No newline at end of file
diff --git a/agentuniverse/agent/action/knowledge/embedding/openai_embedding.py b/agentuniverse/agent/action/knowledge/embedding/openai_embedding.py
index 7fa660cc..f54bbd0d 100644
--- a/agentuniverse/agent/action/knowledge/embedding/openai_embedding.py
+++ b/agentuniverse/agent/action/knowledge/embedding/openai_embedding.py
@@ -5,6 +5,7 @@
 # @Author  : wangchongshi
 # @Email   : wangchongshi.wcs@antgroup.com
 # @FileName: openai_embedding.py
+
 from typing import List, Optional, Any
 
 from langchain_community.embeddings.openai import OpenAIEmbeddings
diff --git a/agentuniverse/agent/action/tool/tool.py b/agentuniverse/agent/action/tool/tool.py
index 2190592b..a005a41a 100644
--- a/agentuniverse/agent/action/tool/tool.py
+++ b/agentuniverse/agent/action/tool/tool.py
@@ -73,6 +73,24 @@ def input_check(self, kwargs: dict) -> None:
             if key not in kwargs.keys():
                 raise Exception(f'{self.get_instance_code()} - The input must include key: {key}.')
 
+    def langchain_run(self, *args, callbacks=None, **kwargs):
+        """The callable method that runs the tool."""
+        kwargs["callbacks"] = callbacks
+        tool_input = ToolInput(kwargs)
+        parse_result = self.parse_react_input(args[0])
+        for key in self.input_keys:
+            tool_input.add_data(key, parse_result[key])
+        return self.execute(tool_input)
+
+    def parse_react_input(self, input_str: str):
+        """
+            parse react string to you input
+            you can define your own logic here by override this function
+        """
+        return {
+            self.input_keys[0]: input_str
+        }
+
     @abstractmethod
     def execute(self, tool_input: ToolInput):
         raise NotImplementedError
@@ -80,7 +98,7 @@ def execute(self, tool_input: ToolInput):
     def as_langchain(self) -> LangchainTool:
         """Convert the agentUniverse(aU) tool class to the langchain tool class."""
         return LangchainTool(name=self.name,
-                             func=self.run,
+                             func=self.langchain_run,
                              description=self.description)
 
     def get_instance_code(self) -> str:
diff --git a/agentuniverse/agent/default/nl2api_agent/__init__.py b/agentuniverse/agent/default/nl2api_agent/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/agentuniverse/agent/default/nl2api_agent/default_cn_prompt.yaml b/agentuniverse/agent/default/nl2api_agent/default_cn_prompt.yaml
new file mode 100644
index 00000000..b2ec805f
--- /dev/null
+++ b/agentuniverse/agent/default/nl2api_agent/default_cn_prompt.yaml
@@ -0,0 +1,27 @@
+introduction: 你是一位精通工具选择ai助手。
+target: 你的目标是根据用户的问题选择出合适的工具。
+instruction: |
+  你需要根据问题和用户提供的工具，选择其中的一个或几个工具用来回答用户提出的问题。
+  你必须从多个角度、维度分析用户的问题，需要根据背景和问题，决定使用哪些工具可以回答用户问题。 
+  
+  您可以使用以下工具:
+  {tools}
+  
+  之前的对话: 
+  {chat_history}
+  
+  背景信息是: 
+  {background}
+  
+  回答必须是按照以下格式化的Json代码片段。
+  1. tools字段代表选择的几个工具的完整名称，列表格式。例如：[add, sub, mul, div]
+  2. thought字段代表选择工具的思考过程和原因。
+  ```{{
+    "tools": list,
+    "thought": string
+  }}```
+  
+  当前的问题：{input}
+metadata:
+  type: 'PROMPT'
+  version: 'default_nl2api_agent.cn'
diff --git a/agentuniverse/agent/default/nl2api_agent/default_en_prompt.yaml b/agentuniverse/agent/default/nl2api_agent/default_en_prompt.yaml
new file mode 100644
index 00000000..31f8b411
--- /dev/null
+++ b/agentuniverse/agent/default/nl2api_agent/default_en_prompt.yaml
@@ -0,0 +1,26 @@
+introduction: You are an AI assistant proficient in tool selection.
+target: Your goal is to select the appropriate tools based on the user's questions.
+instruction: |
+  Your task is to select one or several tools from those provided by the user, based on their question and the context, in order to answer the user's query.
+  You must analyze the user's problem from multiple angles and dimensions, taking into account the background and context of the question, and decide which tools can be used to answer the user's question.
+  You may use the following tools:  
+  {tools}
+
+  Previous conversation:
+  {chat_history}
+  
+  The background information is:
+  {background}
+  
+  The response must follow the format below as a formatted JSON code snippet.
+  1. The tools field represents the full names of the selected tools in a list format, such as:[add, sub, mul, div]
+  2. The thought field represents the thinking process and reasons behind the selection of tools.
+  ```{{
+    "tools": list,
+    "thought": string
+  }}```
+  
+  Question: {input}
+metadata:
+  type: 'PROMPT'
+  version: 'default_nl2api_agent.en'
diff --git a/agentuniverse/agent/default/nl2api_agent/nl2api_agent.py b/agentuniverse/agent/default/nl2api_agent/nl2api_agent.py
new file mode 100644
index 00000000..a88892a8
--- /dev/null
+++ b/agentuniverse/agent/default/nl2api_agent/nl2api_agent.py
@@ -0,0 +1,45 @@
+# !/usr/bin/env python3
+# -*- coding:utf-8 -*-
+
+# @Time    : 2024/6/11 17:14
+# @Author  : weizjajj 
+# @Email   : weizhongjie.wzj@antgroup.com
+# @FileName: nl2api_agent.py
+
+from agentuniverse.agent.agent import Agent
+from agentuniverse.agent.input_object import InputObject
+
+
+class Nl2ApiAgent(Agent):
+    """ReAct Agent class."""
+
+    def input_keys(self) -> list[str]:
+        """Return the input keys of the Agent."""
+        return ['input']
+
+    def output_keys(self) -> list[str]:
+        """Return the output keys of the Agent."""
+        return ['output']
+
+    def parse_input(self, input_object: InputObject, agent_input: dict) -> dict:
+        """Agent parameter parsing.
+
+        Args:
+            input_object (InputObject): input parameters passed by the user.
+            agent_input (dict): agent input preparsed by the agent.
+        Returns:
+            dict: agent input parsed from `input_object` by the user.
+        """
+        agent_input['input'] = input_object.get_data('input')
+        self.agent_model.profile.setdefault('prompt_version', 'default_nl2api_agent.cn')
+        return agent_input
+
+    def parse_result(self, planner_result: dict) -> dict:
+        """Planner result parser.
+
+        Args:
+            planner_result(dict): Planner result
+        Returns:
+            dict: Agent result object.
+        """
+        return planner_result
diff --git a/agentuniverse/agent/default/nl2api_agent/nl2api_agent.yaml b/agentuniverse/agent/default/nl2api_agent/nl2api_agent.yaml
new file mode 100644
index 00000000..79245c65
--- /dev/null
+++ b/agentuniverse/agent/default/nl2api_agent/nl2api_agent.yaml
@@ -0,0 +1,17 @@
+info:
+  name: 'nl2api_agent'
+  description: 'nl2api agent'
+profile:
+  llm_model:
+    name: 'default_openai_llm'
+    model_name: 'gpt-4o'
+action:
+  tool:
+    - ''
+plan:
+  planner:
+    name: 'nl2api_planner'
+metadata:
+  type: 'AGENT'
+  module: 'agentuniverse.agent.default.nl2api_agent.nl2api_agent'
+  class: 'Nl2ApiAgent'
\ No newline at end of file
diff --git a/agentuniverse/agent/default/react_agent/__init__.py b/agentuniverse/agent/default/react_agent/__init__.py
new file mode 100644
index 00000000..89d328f4
--- /dev/null
+++ b/agentuniverse/agent/default/react_agent/__init__.py
@@ -0,0 +1,7 @@
+# !/usr/bin/env python3
+# -*- coding:utf-8 -*-
+
+# @Time    : 2024/6/4 21:21
+# @Author  : wangchongshi
+# @Email   : wangchongshi.wcs@antgroup.com
+# @FileName: __init__.py.py
diff --git a/agentuniverse/agent/default/react_agent/default_cn_prompt.yaml b/agentuniverse/agent/default/react_agent/default_cn_prompt.yaml
new file mode 100644
index 00000000..df8d8659
--- /dev/null
+++ b/agentuniverse/agent/default/react_agent/default_cn_prompt.yaml
@@ -0,0 +1,35 @@
+introduction: 你是一位精通信息分析的ai助手。
+target: 你的目标是根据用户的问题以及给出的背景信息给出答案。
+instruction: |
+  你必须优先选择使用提供的工具回答用户提出的问题，若用户没有提供工具可以根据你的通识能力解决问题。
+  你在回答时问题必须使用中文回答。
+  你必须从多个角度、维度分析用户的问题，帮助用户获取最全面的信息，需要根据背景和问题，决定搜索哪些信息可以回答问题。 
+  请注意: 你在给出最终答案时需要从多角度给出更详细的原因，而不是一个简单的结论。
+  
+  您可以使用以下工具:
+  {tools}
+  
+  你的回答必须严格使用以下格式:
+  
+    Question: 您必须回答的问题
+    Thought: 你应该经常想想该怎么做
+    Action: 要采取的行动应该是 one of [{tool_names}]
+    Action Input: 行动的输入
+    Observation: 行动的结果
+    ... (Thought/Action/Action Input/Observation 的过程可以重复 N 次)
+    Thought: 我现在知道最终答案了
+    Final Answer: 原输入问题的最终答案
+  
+  之前的对话:
+  {chat_history}
+  
+  背景信息是:
+  {background}
+  
+  开始!
+  
+  Question: {input}
+  Thought:{agent_scratchpad}
+metadata:
+  type: 'PROMPT'
+  version: 'default_react_agent.cn'
diff --git a/agentuniverse/agent/default/react_agent/default_en_prompt.yaml b/agentuniverse/agent/default/react_agent/default_en_prompt.yaml
new file mode 100644
index 00000000..92137f90
--- /dev/null
+++ b/agentuniverse/agent/default/react_agent/default_en_prompt.yaml
@@ -0,0 +1,31 @@
+introduction: You are an AI assistant who is proficient in information analysis.
+target: Your goal is to give answers based on the user's question and the context given.
+instruction: |
+  Answer the following questions as best you can. You have access to the following tools:
+
+  {tools}
+
+  Use the following format:
+
+    Question: the input question you must answer
+    Thought: you should always think about what to do
+    Action: the action to take, should be one of [{tool_names}]
+    Action Input: the input to the action
+    Observation: the result of the action
+    ... (this Thought/Action/Action Input/Observation can repeat N times)
+    Thought: I now know the final answer
+    Final Answer: the final answer to the original input question
+  
+  Previous conversion:
+  {chat_history}
+  
+  Background:
+  {background}
+  
+  Begin!
+
+  Question: {input}
+  Thought:{agent_scratchpad}
+metadata:
+  type: 'PROMPT'
+  version: 'default_react_agent.en'
diff --git a/agentuniverse/agent/default/react_agent/react_agent.py b/agentuniverse/agent/default/react_agent/react_agent.py
new file mode 100644
index 00000000..f50e7057
--- /dev/null
+++ b/agentuniverse/agent/default/react_agent/react_agent.py
@@ -0,0 +1,44 @@
+# !/usr/bin/env python3
+# -*- coding:utf-8 -*-
+
+# @Time    : 2024/5/31 21:22
+# @Author  : wangchongshi
+# @Email   : wangchongshi.wcs@antgroup.com
+# @FileName: react_agent.py
+from agentuniverse.agent.agent import Agent
+from agentuniverse.agent.input_object import InputObject
+
+
+class ReActAgent(Agent):
+    """ReAct Agent class."""
+
+    def input_keys(self) -> list[str]:
+        """Return the input keys of the Agent."""
+        return ['input']
+
+    def output_keys(self) -> list[str]:
+        """Return the output keys of the Agent."""
+        return ['output']
+
+    def parse_input(self, input_object: InputObject, agent_input: dict) -> dict:
+        """Agent parameter parsing.
+
+        Args:
+            input_object (InputObject): input parameters passed by the user.
+            agent_input (dict): agent input preparsed by the agent.
+        Returns:
+            dict: agent input parsed from `input_object` by the user.
+        """
+        agent_input['input'] = input_object.get_data('input')
+        self.agent_model.profile.setdefault('prompt_version', 'default_react_agent.cn')
+        return agent_input
+
+    def parse_result(self, planner_result: dict) -> dict:
+        """Planner result parser.
+
+        Args:
+            planner_result(dict): Planner result
+        Returns:
+            dict: Agent result object.
+        """
+        return planner_result
diff --git a/agentuniverse/agent/default/react_agent/react_agent.yaml b/agentuniverse/agent/default/react_agent/react_agent.yaml
new file mode 100644
index 00000000..48309fc5
--- /dev/null
+++ b/agentuniverse/agent/default/react_agent/react_agent.yaml
@@ -0,0 +1,17 @@
+info:
+  name: 'react_agent'
+  description: 'react agent'
+profile:
+  llm_model:
+    name: 'default_openai_llm'
+    model_name: 'gpt-4o'
+action:
+  tool:
+    - ''
+plan:
+  planner:
+    name: 'react_planner'
+metadata:
+  type: 'AGENT'
+  module: 'agentuniverse.agent.default.react_agent.react_agent'
+  class: 'ReActAgent'
\ No newline at end of file
diff --git a/agentuniverse/agent/plan/planner/executing_planner/executing_planner.py b/agentuniverse/agent/plan/planner/executing_planner/executing_planner.py
index 9d2a3db0..f792fea7 100644
--- a/agentuniverse/agent/plan/planner/executing_planner/executing_planner.py
+++ b/agentuniverse/agent/plan/planner/executing_planner/executing_planner.py
@@ -39,7 +39,7 @@ def invoke(self, agent_model: AgentModel, planner_input: dict, input_object: Inp
 
         memory: ChatMemory = self.handle_memory(agent_model, planner_input)
 
-        self.handle_all_actions(agent_model, planner_input, input_object)
+        self.run_all_actions(agent_model, planner_input, input_object)
 
         llm: LLM = self.handle_llm(agent_model)
 
diff --git a/agentuniverse/agent/plan/planner/nl2api_planner/__init__.py b/agentuniverse/agent/plan/planner/nl2api_planner/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/agentuniverse/agent/plan/planner/nl2api_planner/nl2api_planner.py b/agentuniverse/agent/plan/planner/nl2api_planner/nl2api_planner.py
new file mode 100644
index 00000000..55d7d8d7
--- /dev/null
+++ b/agentuniverse/agent/plan/planner/nl2api_planner/nl2api_planner.py
@@ -0,0 +1,111 @@
+# !/usr/bin/env python3
+# -*- coding:utf-8 -*-
+# @Time    : 2024/3/18 10:50
+# @Author  : heji
+# @Email   : lc299034@antgroup.com
+# @FileName: expressing_planner.py
+"""Expressing planner module."""
+import asyncio
+
+from langchain_core.chat_history import InMemoryChatMessageHistory
+from langchain_core.output_parsers import JsonOutputParser
+from langchain_core.runnables.history import RunnableWithMessageHistory
+from langchain.tools import Tool as LangchainTool
+
+from agentuniverse.agent.action.tool.tool import Tool
+from agentuniverse.agent.action.tool.tool_manager import ToolManager
+from agentuniverse.agent.agent_model import AgentModel
+from agentuniverse.agent.input_object import InputObject
+from agentuniverse.agent.memory.chat_memory import ChatMemory
+from agentuniverse.agent.plan.planner.planner import Planner
+from agentuniverse.base.util.memory_util import generate_memories
+from agentuniverse.base.util.prompt_util import process_llm_token
+from agentuniverse.llm.llm import LLM
+from agentuniverse.prompt.prompt import Prompt
+from agentuniverse.prompt.prompt_manager import PromptManager
+from agentuniverse.prompt.prompt_model import AgentPromptModel
+
+
+class Nl2ApiPlanner(Planner):
+    """Expressing planner class."""
+
+    def invoke(self, agent_model: AgentModel, planner_input: dict, input_object: InputObject) -> dict:
+        """Invoke the planner.
+
+        Args:
+            agent_model (AgentModel): Agent model object.
+            planner_input (dict): Planner input object.
+            input_object (InputObject): The input parameters passed by the user.
+        Returns:
+            dict: The planner result.
+        """
+        memory: ChatMemory = self.handle_memory(agent_model, planner_input)
+
+        llm: LLM = self.handle_llm(agent_model)
+
+        prompt: Prompt = self.handle_prompt(agent_model, planner_input)
+
+        process_llm_token(llm, prompt.as_langchain(), agent_model.profile, planner_input)
+
+        chat_history = memory.as_langchain().chat_memory if memory else InMemoryChatMessageHistory()
+
+        chain_with_history = RunnableWithMessageHistory(
+            prompt.as_langchain() | llm.as_langchain(),
+            lambda session_id: chat_history,
+            history_messages_key="chat_history",
+            input_messages_key=self.input_key,
+        ) | JsonOutputParser()
+        res = asyncio.run(
+            chain_with_history.ainvoke(input=planner_input, config={"configurable": {"session_id": "unused"}}))
+        return {**planner_input, self.output_key: res, 'chat_history': generate_memories(chat_history)}
+
+    @staticmethod
+    def acquire_tools(action) -> list[LangchainTool]:
+        tool_names: list = action.get('tool') or list()
+        lc_tools: list[LangchainTool] = list()
+        for tool_name in tool_names:
+            tool: Tool = ToolManager().get_instance_obj(tool_name)
+            lc_tools.append(tool.as_langchain())
+        return lc_tools
+
+    def handle_prompt(self, agent_model: AgentModel, planner_input: dict) -> Prompt:
+        """
+        Prompt module processing.
+
+        Args:
+            agent_model (AgentModel): Agent model object.
+            planner_input (dict): Planner input object.
+        Returns:
+            ChatPrompt: The chat prompt instance.
+        """
+        tools = self.acquire_tools(action=agent_model.action)
+        lc_tools_str: str = ''
+        for lc_tool in tools:
+            lc_tools_str += "tool name:" + lc_tool.name + " " + "tool description:" + lc_tool.description + '\n'
+        lc_tool_names = "|".join([lc_tool.name for lc_tool in tools])
+        planner_input['tool_names'] = lc_tool_names
+        planner_input['tools'] = lc_tools_str
+        planner_input['agent_scratchpad'] = ''
+        #
+        profile: dict = agent_model.profile
+        #
+        profile_prompt_model: AgentPromptModel = AgentPromptModel(introduction=profile.get('introduction'),
+                                                                  target=profile.get('target'),
+                                                                  instruction=profile.get('instruction'))
+
+        # get the prompt by the prompt version
+        prompt_version: str = profile.get('prompt_version')
+        version_prompt: Prompt = PromptManager().get_instance_obj(prompt_version)
+
+        if version_prompt is None and not profile_prompt_model:
+            raise Exception("Either the `prompt_version` or `introduction & target & instruction`"
+                            " in agent profile configuration should be provided.")
+        if version_prompt:
+            version_prompt_model: AgentPromptModel = AgentPromptModel(
+                introduction=getattr(version_prompt, 'introduction', ''),
+                target=getattr(version_prompt, 'target', ''),
+                instruction=getattr(version_prompt, 'instruction', ''))
+            profile_prompt_model = profile_prompt_model + version_prompt_model
+
+        prompt = Prompt().build_prompt(profile_prompt_model, self.prompt_assemble_order)
+        return prompt
\ No newline at end of file
diff --git a/agentuniverse/agent/plan/planner/nl2api_planner/nl2api_planner.yaml b/agentuniverse/agent/plan/planner/nl2api_planner/nl2api_planner.yaml
new file mode 100644
index 00000000..1de5943f
--- /dev/null
+++ b/agentuniverse/agent/plan/planner/nl2api_planner/nl2api_planner.yaml
@@ -0,0 +1,6 @@
+name: 'nl2api_planner'
+description: 'nl2api planner'
+metadata:
+  type: 'PLANNER'
+  module: 'agentuniverse.agent.plan.planner.nl2api_planner.nl2api_planner'
+  class: 'Nl2ApiPlanner'
\ No newline at end of file
diff --git a/agentuniverse/agent/plan/planner/planner.py b/agentuniverse/agent/plan/planner/planner.py
index 7c9def6a..c30fd311 100644
--- a/agentuniverse/agent/plan/planner/planner.py
+++ b/agentuniverse/agent/plan/planner/planner.py
@@ -90,7 +90,7 @@ def handle_memory(self, agent_model: AgentModel, planner_input: dict) -> ChatMem
         memory.set_by_agent_model(**params)
         return memory
 
-    def handle_all_actions(self, agent_model: AgentModel, planner_input: dict, input_object: InputObject):
+    def run_all_actions(self, agent_model: AgentModel, planner_input: dict, input_object: InputObject):
         """Tool and knowledge processing.
 
         Args:
diff --git a/agentuniverse/agent/plan/planner/rag_planner/rag_planner.py b/agentuniverse/agent/plan/planner/rag_planner/rag_planner.py
index f95ea34d..4edb1f6a 100644
--- a/agentuniverse/agent/plan/planner/rag_planner/rag_planner.py
+++ b/agentuniverse/agent/plan/planner/rag_planner/rag_planner.py
@@ -40,7 +40,7 @@ def invoke(self, agent_model: AgentModel, planner_input: dict,
         """
         memory: ChatMemory = self.handle_memory(agent_model, planner_input)
 
-        self.handle_all_actions(agent_model, planner_input, input_object)
+        self.run_all_actions(agent_model, planner_input, input_object)
 
         llm: LLM = self.handle_llm(agent_model)
 
diff --git a/agentuniverse/agent/plan/planner/react_planner/__init__.py b/agentuniverse/agent/plan/planner/react_planner/__init__.py
new file mode 100644
index 00000000..233deb77
--- /dev/null
+++ b/agentuniverse/agent/plan/planner/react_planner/__init__.py
@@ -0,0 +1,7 @@
+# !/usr/bin/env python3
+# -*- coding:utf-8 -*-
+
+# @Time    : 2024/6/4 21:00
+# @Author  : wangchongshi
+# @Email   : wangchongshi.wcs@antgroup.com
+# @FileName: __init__.py.py
diff --git a/agentuniverse/agent/plan/planner/react_planner/react_planner.py b/agentuniverse/agent/plan/planner/react_planner/react_planner.py
new file mode 100644
index 00000000..ef1f76f9
--- /dev/null
+++ b/agentuniverse/agent/plan/planner/react_planner/react_planner.py
@@ -0,0 +1,122 @@
+# !/usr/bin/env python3
+# -*- coding:utf-8 -*-
+
+# @Time    : 2024/5/31 21:22
+# @Author  : wangchongshi
+# @Email   : wangchongshi.wcs@antgroup.com
+# @FileName: react_planner.py
+
+from langchain_core.chat_history import InMemoryChatMessageHistory
+from langchain.agents import AgentExecutor, create_react_agent
+from langchain.tools import Tool as LangchainTool
+from langchain_core.runnables import RunnableConfig
+
+from agentuniverse.agent.action.tool.tool import Tool
+from agentuniverse.agent.action.tool.tool_manager import ToolManager
+from agentuniverse.agent.agent_model import AgentModel
+from agentuniverse.agent.input_object import InputObject
+from agentuniverse.agent.memory.chat_memory import ChatMemory
+from agentuniverse.agent.plan.planner.planner import Planner
+from agentuniverse.agent.plan.planner.react_planner.stream_callback import StreamOutPutCallbackHandler
+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
+
+
+class ReActPlanner(Planner):
+    """ReAct planner class."""
+
+    tools: list[LangchainTool] = None
+
+    def invoke(self, agent_model: AgentModel, planner_input: dict,
+               input_object: InputObject) -> dict:
+        """Invoke the planner.
+
+        Args:
+            agent_model (AgentModel): Agent model object.
+            planner_input (dict): Planner input object.
+            input_object (InputObject): The input parameters passed by the user.
+        Returns:
+            dict: The planner result.
+        """
+
+        memory: ChatMemory = self.handle_memory(agent_model, planner_input)
+
+        llm: LLM = self.handle_llm(agent_model)
+
+        tools = self.acquire_tools(agent_model.action)
+
+        prompt: Prompt = self.handle_prompt(agent_model, planner_input)
+        process_llm_token(llm, prompt.as_langchain(), agent_model.profile, planner_input)
+        chat_history = memory.as_langchain().chat_memory if memory else InMemoryChatMessageHistory()
+
+        agent = create_react_agent(llm.as_langchain(), tools, prompt.as_langchain())
+        agent_executor = AgentExecutor(agent=agent, tools=tools,
+                                       verbose=True,
+                                       handle_parsing_errors=True,
+                                       max_iterations=agent_model.plan.get('planner').get("max_iterations", 15))
+
+        return agent_executor.invoke(input=planner_input, memory=memory.as_langchain() if memory else None,
+                                     chat_history=chat_history, config=self.get_run_config(input_object))
+
+    @staticmethod
+    def get_run_config(input_object: InputObject) -> RunnableConfig:
+        config = RunnableConfig()
+        callbacks = []
+        output_stream = input_object.get_data('output_stream')
+        callbacks.append(StreamOutPutCallbackHandler(output_stream))
+        config.setdefault("callbacks", callbacks)
+        return config
+
+    @staticmethod
+    def acquire_tools(action) -> list[LangchainTool]:
+        tool_names: list = action.get('tool') or list()
+        lc_tools: list[LangchainTool] = list()
+        for tool_name in tool_names:
+            tool: Tool = ToolManager().get_instance_obj(tool_name)
+            lc_tools.append(tool.as_langchain())
+        return lc_tools
+
+    def handle_prompt(self, agent_model: AgentModel, planner_input: dict) -> Prompt:
+        """Prompt module processing.
+
+        Args:
+            agent_model (AgentModel): Agent model object.
+            planner_input (dict): Planner input object.
+        Returns:
+            ChatPrompt: The chat prompt instance.
+        """
+        lc_tools_str: str = ''
+        tools = self.acquire_tools(agent_model.action)
+        for lc_tool in self.acquire_tools(agent_model.action):
+            lc_tools_str += "tool name:" + lc_tool.name + " " + "tool description:" + lc_tool.description + '\n'
+        lc_tool_names = "|".join([lc_tool.name for lc_tool in tools])
+        planner_input['tool_names'] = lc_tool_names
+        planner_input['tools'] = lc_tools_str
+        planner_input['agent_scratchpad'] = ''
+
+        profile: dict = agent_model.profile
+
+        profile_prompt_model: AgentPromptModel = AgentPromptModel(introduction=profile.get('introduction'),
+                                                                  target=profile.get('target'),
+                                                                  instruction=profile.get('instruction'))
+
+        # get the prompt by the prompt version
+        prompt_version: str = profile.get('prompt_version')
+        version_prompt: Prompt = PromptManager().get_instance_obj(prompt_version)
+
+        if version_prompt is None and not profile_prompt_model:
+            raise Exception("Either the `prompt_version` or `introduction & target & instruction`"
+                            " in agent profile configuration should be provided.")
+        if version_prompt:
+            version_prompt_model: AgentPromptModel = AgentPromptModel(
+                introduction=getattr(version_prompt, 'introduction', ''),
+                target=getattr(version_prompt, 'target', ''),
+                instruction=getattr(version_prompt, 'instruction', ''))
+            profile_prompt_model = profile_prompt_model + version_prompt_model
+
+        prompt = Prompt().build_prompt(profile_prompt_model, self.prompt_assemble_order)
+        return prompt
diff --git a/agentuniverse/agent/plan/planner/react_planner/react_planner.yaml b/agentuniverse/agent/plan/planner/react_planner/react_planner.yaml
new file mode 100644
index 00000000..8af5eefb
--- /dev/null
+++ b/agentuniverse/agent/plan/planner/react_planner/react_planner.yaml
@@ -0,0 +1,6 @@
+name: 'react_planner'
+description: 'react planner'
+metadata:
+  type: 'PLANNER'
+  module: 'agentuniverse.agent.plan.planner.react_planner.react_planner'
+  class: 'ReActPlanner'
\ No newline at end of file
diff --git a/agentuniverse/agent/plan/planner/react_planner/stream_callback.py b/agentuniverse/agent/plan/planner/react_planner/stream_callback.py
new file mode 100644
index 00000000..87ec6acd
--- /dev/null
+++ b/agentuniverse/agent/plan/planner/react_planner/stream_callback.py
@@ -0,0 +1,64 @@
+# !/usr/bin/env python3
+# -*- coding:utf-8 -*-
+
+# @Time    : 2024/6/13 11:03
+# @Author  : weizjajj 
+# @Email   : weizhongjie.wzj@antgroup.com
+# @FileName: stream_callback.py
+
+import asyncio
+from typing import Optional, Dict, Any
+
+from langchain_core.agents import AgentAction, AgentFinish
+from langchain_core.callbacks import BaseCallbackHandler
+
+
+class StreamOutPutCallbackHandler(BaseCallbackHandler):
+    """Callback Handler that prints to std out."""
+
+    def __init__(self, queue_stream: asyncio.Queue, color: Optional[str] = None) -> None:
+        """Initialize callback handler."""
+        self.queueStream = queue_stream
+        self.color = color
+
+    def on_chain_start(
+            self, serialized: Dict[str, Any], inputs: Dict[str, Any], **kwargs: Any
+    ) -> None:
+        return
+
+    def on_chain_end(self, outputs: Dict[str, Any], **kwargs: Any) -> None:
+        """Print out that we finished a chain."""
+
+    def on_agent_action(
+            self, action: AgentAction, color: Optional[str] = None, **kwargs: Any
+    ) -> Any:
+        self.queueStream.put_nowait("Thought:"+action.log)
+
+    def on_tool_end(
+            self,
+            output: str,
+            color: Optional[str] = None,
+            observation_prefix: Optional[str] = None,
+            llm_prefix: Optional[str] = None,
+            **kwargs: Any,
+    ) -> None:
+        """If not the final action, print out observation."""
+        if observation_prefix is not None:
+            self.queueStream.put_nowait(observation_prefix + output)
+        else:
+            self.queueStream.put_nowait('Observation:'+output)
+
+    def on_text(
+            self,
+            text: str,
+            color: Optional[str] = None,
+            end: str = "",
+            **kwargs: Any,
+    ) -> None:
+        """Run when agent ends."""
+
+    def on_agent_finish(
+            self, finish: AgentFinish, color: Optional[str] = None, **kwargs: Any
+    ) -> None:
+        """Run on agent end."""
+        self.queueStream.put_nowait("Thought:" + finish.log + "\n")
diff --git a/agentuniverse/base/util/prompt_util.py b/agentuniverse/base/util/prompt_util.py
index ec6b2dcb..cc0b0612 100644
--- a/agentuniverse/base/util/prompt_util.py
+++ b/agentuniverse/base/util/prompt_util.py
@@ -163,6 +163,9 @@ def process_llm_token(agent_llm: LLM, lc_prompt_template, profile: dict, planner
     prompt_tokens: int = agent_llm.get_num_tokens(prompt)
 
     input_tokens = agent_llm.max_context_length() - agent_llm.max_tokens
+    if input_tokens <= 0:
+        raise Exception("The current output max tokens limit is greater than the context length of the LLM model, "
+                        "please adjust it by editing the `max_tokens` parameter in the llm yaml.")
 
     if prompt_tokens <= input_tokens:
         return
diff --git a/agentuniverse/llm/claude_langchain_instance.py b/agentuniverse/llm/claude_langchain_instance.py
new file mode 100644
index 00000000..e7876543
--- /dev/null
+++ b/agentuniverse/llm/claude_langchain_instance.py
@@ -0,0 +1,93 @@
+# !/usr/bin/env python3
+# -*- coding:utf-8 -*-
+
+# @Time    : 2024/5/22 17:07
+# @Author  : weizjajj 
+# @Email   : weizhongjie.wzj@antgroup.com
+# @FileName: claude_langchain_instance.py
+
+import warnings
+from typing import List, Optional, Any
+
+from langchain_anthropic import ChatAnthropic
+from langchain_anthropic.chat_models import _tools_in_params
+from langchain_core.callbacks import CallbackManagerForLLMRun, AsyncCallbackManagerForLLMRun
+from langchain_core.language_models.chat_models import generate_from_stream, agenerate_from_stream
+from langchain_core.messages import BaseMessage, SystemMessage, HumanMessage
+from langchain_core.outputs import ChatResult
+
+from agentuniverse.llm.llm import LLM
+
+
+class ClaudeLangChainInstance(ChatAnthropic):
+    """
+    This class wraps the Claude API into a LangChain API.
+    """
+    llm: LLM = None
+
+    def __init__(self, llm: LLM):
+        init_params = {}
+        init_params['model'] = llm.model_name if llm.model_name else 'Claude-Instant-V1.3'
+        init_params['temperature'] = llm.temperature if llm.temperature else 0.7
+        init_params['default_request_timeout'] = llm.request_timeout
+        init_params['streaming'] = llm.streaming if llm.streaming else False
+        init_params['anthropic_api_key'] = llm.anthropic_api_key if llm.anthropic_api_key else 'blank'
+        init_params['max_tokens'] = llm.max_tokens
+        init_params['max_retries'] = llm.max_retries if llm.max_retries else 2
+        init_params['anthropic_api_url'] = llm.anthropic_api_url
+        init_params['streaming'] = llm.streaming
+        init_params['llm'] = llm
+        super().__init__(**init_params)
+
+    def _generate(
+            self,
+            messages: List[BaseMessage],
+            stop: Optional[List[str]] = None,
+            run_manager: Optional[CallbackManagerForLLMRun] = None,
+            **kwargs: Any,
+    ) -> ChatResult:
+        if len(messages) > 1 and isinstance(messages[1], SystemMessage):
+            messages[1] = HumanMessage(content=messages[1].content)
+        params = self._format_params(messages=messages, stop=stop, **kwargs)
+        if self.streaming:
+            if _tools_in_params(params):
+                warnings.warn(
+                    "stream: Tool use is not yet supported in streaming mode."
+                )
+            else:
+                stream_iter = self._stream(
+                    messages, stop=stop, run_manager=run_manager, **kwargs
+                )
+                return generate_from_stream(stream_iter)
+        if _tools_in_params(params):
+            data = self._client.beta.tools.messages.create(**params)
+        else:
+            data = self.llm.call(**params).raw
+        return self._format_output(data, **kwargs)
+
+    async def _agenerate(
+            self,
+            messages: List[BaseMessage],
+            stop: Optional[List[str]] = None,
+            run_manager: Optional[AsyncCallbackManagerForLLMRun] = None,
+            **kwargs: Any,
+    ) -> ChatResult:
+        if len(messages) > 1 and isinstance(messages[1], SystemMessage):
+            messages[1] = HumanMessage(content=messages[1].content)
+        params = self._format_params(messages=messages, stop=stop, **kwargs)
+        if self.streaming:
+            if _tools_in_params(params):
+                warnings.warn(
+                    "stream: Tool use is not yet supported in streaming mode."
+                )
+            else:
+                stream_iter = self._astream(
+                    messages, stop=stop, run_manager=run_manager, **kwargs
+                )
+                return await agenerate_from_stream(stream_iter)
+        if _tools_in_params(params):
+            data = await self._async_client.beta.tools.messages.create(**params)
+        else:
+            data = await self.llm.acall(**params)
+            data = data.raw
+        return self._format_output(data, **kwargs)
diff --git a/agentuniverse/llm/default/claude_llm.py b/agentuniverse/llm/default/claude_llm.py
new file mode 100644
index 00000000..bee1f820
--- /dev/null
+++ b/agentuniverse/llm/default/claude_llm.py
@@ -0,0 +1,154 @@
+# !/usr/bin/env python3
+# -*- coding:utf-8 -*-
+
+# @Time    : 2024/5/21 17:49
+# @Author  : weizjajj 
+# @Email   : weizhongjie.wzj@antgroup.com
+# @FileName: claude_llm.py
+
+import asyncio
+from typing import Optional, Any, Union, Iterator, AsyncIterator
+
+import anthropic
+import httpx
+from langchain_core.language_models import BaseLanguageModel
+from pydantic import Field
+
+from agentuniverse.base.annotation.trace import trace_llm
+from agentuniverse.base.util.env_util import get_from_env
+from agentuniverse.llm.claude_langchain_instance import ClaudeLangChainInstance
+from agentuniverse.llm.llm import LLM
+from agentuniverse.llm.llm_output import LLMOutput
+
+ClaudeMAXCONTETNLENGTH = {
+    "claude-3-opus-20240229": 200000,
+    "claude-3-sonnet-20240229": 200000,
+    "claude-3-haiku-20240307": 200000,
+    "claude-2.1": 200000,
+    "claude-2.0": 100000,
+    "claude-instant-1.2": 100000
+}
+
+
+class ClaudeLLM(LLM):
+    """
+    This class implements an interface for interacting with the Anthropic Claude model.
+
+    Attribute:
+        anthropic_api_key (Optional[str]): The API key for the Anthropic API. Defaults to the value of the environment variable ANTHROPIC_API_KEY.
+        anthropic_api_url (Optional[str]): The URL for the Anthropic API. Defaults to the value of the environment variable ANTHROPIC_API_URL.
+        anthropic_proxy (Optional[str]): The proxy to use for the Anthropic API. Defaults to None.
+        connection_pool_limits (Optional[int]): The maximum number of connections to keep in a pool. Defaults to None.
+    """
+    anthropic_api_key: Optional[str] = Field(default_factory=lambda: get_from_env('ANTHROPIC_API_KEY'))
+    anthropic_api_url: Optional[str] = Field(default_factory=lambda: get_from_env('ANTHROPIC_API_URL'))
+    anthropic_proxy: Optional[str] = None
+    connection_pool_limits: Optional[int] = None
+
+    def _new_client(self):
+        client = anthropic.Anthropic(
+            api_key=self.anthropic_api_key,
+            base_url=self.anthropic_api_url,
+            timeout=self.request_timeout if self.request_timeout else 60,
+            max_retries=self.max_retries if self.max_retries else 2,
+            http_client=httpx.Client(proxy=self.anthropic_proxy) if self.anthropic_proxy else None,
+            connection_pool_limits=self.connection_pool_limits
+        )
+        return client
+
+    def _new_async_client(self):
+        client = anthropic.AsyncAnthropic(
+            api_key=self.anthropic_api_key,
+            base_url=self.anthropic_api_url,
+            timeout=self.request_timeout if self.request_timeout else 60,
+            max_retries=self.max_retries if self.max_retries else 2,
+            http_client=httpx.AsyncClient(proxy=self.anthropic_proxy) if self.anthropic_proxy else None,
+            connection_pool_limits=self.connection_pool_limits
+        )
+        return client
+    @trace_llm
+    def call(self, messages: list, **kwargs: Any) -> Union[LLMOutput, Iterator[LLMOutput]]:
+        """Run the Claude LLM.
+
+        Args:
+            messages (list): The messages to send to the LLM.
+            **kwargs: Arbitrary keyword arguments.
+        """
+        streaming = kwargs.pop("streaming") if "streaming" in kwargs else self.streaming
+        self.client = self._new_client()
+        chat_completion = self.client.messages.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:
+            self.close()
+            return self.parse_result(chat_completion)
+        return self.generate_stream_result(chat_completion)
+
+    @trace_llm
+    async def acall(self, messages: list, **kwargs: Any) -> Union[LLMOutput, AsyncIterator[LLMOutput]]:
+        streaming = kwargs.pop("streaming") if "streaming" in kwargs else self.streaming
+        self.client = self._new_async_client()
+        chat_completion = await self.client.messages.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:
+            await self.aclose()
+            return self.parse_result(chat_completion)
+        return self.agenerate_stream_result(chat_completion)
+
+    @staticmethod
+    def parse_result(data):
+        text = data.content[0].text
+        if not text:
+            return
+        return LLMOutput(text=text, raw=data)
+
+    def generate_stream_result(self, chat_completion: Iterator):
+        for chunk in chat_completion:
+            if chunk.type != 'content_block_delta':
+                continue
+            yield LLMOutput(text=chunk.delta.text, raw=chunk.model_dump())
+        self.close()
+
+    async def agenerate_stream_result(self, chat_completion: AsyncIterator):
+        async for chunk in chat_completion:
+            print(chunk)
+            if chunk.type != 'content_block_delta':
+                continue
+            yield LLMOutput(text=chunk.delta.text, raw=chunk.model_dump())
+        await self.aclose()
+
+    def as_langchain(self) -> BaseLanguageModel:
+        """
+        Convert this instance into a LangChain compatible object
+        """
+        return ClaudeLangChainInstance(self)
+
+    def get_num_tokens(self, text: str) -> int:
+        encode = self._new_client().count_tokens(text)
+        return encode
+
+    def max_context_length(self) -> int:
+        if super().max_context_length():
+            return super().max_context_length()
+        return ClaudeMAXCONTETNLENGTH[self.model_name]
+
+    def close(self):
+        """Close the client."""
+        if hasattr(self, 'client') and self.client:
+            self.client.close()
+
+    async def aclose(self):
+        """Async close the client."""
+        if hasattr(self, 'async_client') and self.async_client:
+            await self.async_client.aclose()
diff --git a/agentuniverse/llm/default/claude_llm.yaml b/agentuniverse/llm/default/claude_llm.yaml
new file mode 100644
index 00000000..31538a3a
--- /dev/null
+++ b/agentuniverse/llm/default/claude_llm.yaml
@@ -0,0 +1,8 @@
+name: 'default_claude_llm'
+description: 'default kimi llm with spi'
+model_name: 'claude-3-opus-20240229'
+max_tokens: 4096
+metadata:
+  type: 'LLM'
+  module: 'agentuniverse.llm.default.claude_llm'
+  class: 'ClaudeLLM'
\ No newline at end of file
diff --git a/agentuniverse/llm/default/default_ollama_llm.py b/agentuniverse/llm/default/default_ollama_llm.py
new file mode 100644
index 00000000..e8cec875
--- /dev/null
+++ b/agentuniverse/llm/default/default_ollama_llm.py
@@ -0,0 +1,100 @@
+import json
+from typing import Any, Union, AsyncIterator, Iterator, Optional, List, Sequence
+
+import tiktoken
+from langchain_core.language_models import BaseLanguageModel
+from ollama import Options
+from pydantic import Field
+
+from agentuniverse.base.annotation.trace import trace_llm
+from agentuniverse.base.config.component_configer.configers.llm_configer import LLMConfiger
+from agentuniverse.base.util.env_util import get_from_env
+from agentuniverse.llm.llm import LLM
+from agentuniverse.llm.llm_output import LLMOutput
+from agentuniverse.llm.ollama_langchain_instance import OllamaLangchainInstance
+
+
+class OllamaLLM(LLM):
+    base_url: Optional[str] = Field(
+        default_factory=lambda: get_from_env("OLLAMA_BASE_URL") if get_from_env(
+            "OLLAMA_BASE_URL") else "http://localhost:11434")
+    """Base url the model is hosted under."""
+
+    streaming: bool = True
+
+    def _new_client(self):
+        if self.client:
+            return self.client
+        from ollama import Client
+        return Client(
+            host=self.base_url,
+        )
+
+    def _new_async_client(self):
+        if self.async_client:
+            return self.async_client
+        from ollama import AsyncClient
+        return AsyncClient(
+            host=self.base_url,
+        )
+
+    def _options(self):
+        return Options(**{
+            "num_ctx": self.max_context_length(),
+            "num_predict": self.max_tokens,
+            "temperature": self.temperature,
+            "timeout": self.request_timeout,
+            **(self.ext_info if self.ext_info else {}),
+        })
+
+    @trace_llm
+    def call(self, messages, stop=None, **kwargs) -> Union[LLMOutput, Iterator[LLMOutput]]:
+        should_stream = kwargs.pop("stream", self.streaming)
+        client = self._new_client()
+        options = self._options()
+        options.setdefault("stop", stop)
+        res = client.chat(model=self.model_name, messages=messages, options=options, stream=should_stream)
+        if should_stream:
+            return self.generate_result(res)
+        else:
+            return LLMOutput(text=res.get("message").get('content'), raw=json.dumps(res))
+
+    @trace_llm
+    async def acall(self, messages, stop=None, **kwargs) -> Union[LLMOutput, AsyncIterator[LLMOutput]]:
+        client = self._new_async_client()
+        should_stream = kwargs.pop("stream", self.streaming)
+        options = self._options()
+        options.setdefault("stop", stop)
+        res = await client.chat(model=self.model_name, messages=messages, options=options, stream=should_stream)
+        if not should_stream:
+            return LLMOutput(text=res.get("message").get('content'), raw=json.dumps(res))
+        if should_stream:
+            return self.agenerate_result(res)
+
+    def generate_result(self, data):
+        for line in data:
+            yield LLMOutput(text=line.get("message").get('content'), raw=json.dumps(line))
+
+    async def agenerate_result(self, data):
+        async for line in data:
+            yield LLMOutput(text=line.get("message").get('content'), raw=json.dumps(line))
+
+    def as_langchain(self) -> BaseLanguageModel:
+        return OllamaLangchainInstance(
+            self
+        )
+
+    def initialize_by_component_configer(self, component_configer: LLMConfiger) -> 'LLM':
+        super().initialize_by_component_configer(component_configer)
+        if 'base_url' in component_configer.configer.value:
+            self.base_url = component_configer.configer.value['base_url']
+        if 'max_context_length' in component_configer.configer.value:
+            self._max_context_length = component_configer.configer.value['max_context_length']
+        return self
+
+    def get_num_tokens(self, text: str) -> int:
+        try:
+            encoding = tiktoken.encoding_for_model(self.model_name)
+        except KeyError:
+            encoding = tiktoken.get_encoding("cl100k_base")
+        return len(encoding.encode(text))
diff --git a/agentuniverse/llm/default/default_ollama_llm.yaml b/agentuniverse/llm/default/default_ollama_llm.yaml
new file mode 100644
index 00000000..84b7a284
--- /dev/null
+++ b/agentuniverse/llm/default/default_ollama_llm.yaml
@@ -0,0 +1,9 @@
+name: 'default_ollama_llm'
+description: 'default openai llm with spi'
+model_name: 'qwen2:7b'
+max_tokens: 1000
+max_context_length: 32000
+metadata:
+  type: 'LLM'
+  module: 'agentuniverse.llm.default.default_ollama_llm'
+  class: 'OllamaLLM'
\ No newline at end of file
diff --git a/agentuniverse/llm/llm.py b/agentuniverse/llm/llm.py
index 736e7f67..53c4fd67 100644
--- a/agentuniverse/llm/llm.py
+++ b/agentuniverse/llm/llm.py
@@ -45,7 +45,7 @@ class LLM(ComponentBase):
     streaming: Optional[bool] = False
     ext_info: Optional[dict] = None
     tracing: Optional[bool] = None
-    __max_context_length: Optional[int] = None
+    _max_context_length: Optional[int] = None
 
     def __init__(self, **kwargs):
         """Initialize the llm."""
@@ -120,14 +120,14 @@ def set_by_agent_model(self, **kwargs) -> None:
         if 'streaming' in kwargs and kwargs['streaming']:
             self.streaming = kwargs['streaming']
         if 'max_context_length' in kwargs and kwargs['max_context_length']:
-            self.__max_context_length = kwargs['max_context_length']
+            self._max_context_length = kwargs['max_context_length']
 
     def max_context_length(self) -> int:
         """Max context length.
 
         The total length of input tokens and generated tokens is limited by the model's context length.
         """
-        return self.__max_context_length
+        return self._max_context_length
 
     @abstractmethod
     def get_num_tokens(self, text: str) -> int:
diff --git a/agentuniverse/llm/ollama_langchain_instance.py b/agentuniverse/llm/ollama_langchain_instance.py
new file mode 100644
index 00000000..845ffa64
--- /dev/null
+++ b/agentuniverse/llm/ollama_langchain_instance.py
@@ -0,0 +1,39 @@
+from typing import List, Optional, Iterator, Any, AsyncIterator
+
+from langchain_community.chat_models import ChatOllama
+from langchain_core.messages import BaseMessage
+
+from agentuniverse.llm.llm import LLM
+
+
+class OllamaLangchainInstance(ChatOllama):
+    llm: LLM = None
+
+    def __init__(self, llm: LLM):
+        super().__init__()
+        self.llm = llm
+        self.model = llm.model_name
+
+    def _create_chat_stream(
+            self,
+            messages: List[BaseMessage],
+            stop: Optional[List[str]] = None,
+            **kwargs: Any,
+    ) -> Iterator[str]:
+        data = self.llm.call(
+            messages=self._convert_messages_to_ollama_messages(messages), stop=stop, **kwargs
+        )
+        for llm_output in data:
+            yield llm_output.raw
+
+    async def _acreate_chat_stream(
+            self,
+            messages: List[BaseMessage],
+            stop: Optional[List[str]] = None,
+            **kwargs: Any,
+    ) -> AsyncIterator[str]:
+        data = await self.llm.acall(
+                messages=self._convert_messages_to_ollama_messages(messages), stop=stop, **kwargs
+        )
+        async for llm_output in data:
+            yield llm_output.raw
diff --git a/agentuniverse/llm/openai_style_langchain_instance.py b/agentuniverse/llm/openai_style_langchain_instance.py
index 8b9506ce..f17e01e8 100644
--- a/agentuniverse/llm/openai_style_langchain_instance.py
+++ b/agentuniverse/llm/openai_style_langchain_instance.py
@@ -6,11 +6,12 @@
 # @Email   : weizhongjie.wzj@antgroup.com
 # @FileName: langchain_openai_style_instance.py
 
-from typing import Any, List, Optional, AsyncIterator
+from typing import Any, List, Optional, AsyncIterator, Iterator
 
 from langchain.callbacks.manager import AsyncCallbackManagerForLLMRun, CallbackManagerForLLMRun
 from langchain.schema import BaseMessage, ChatResult
-from langchain_community.chat_models.openai import _convert_delta_to_message_chunk
+from langchain_community.chat_models.openai import _convert_delta_to_message_chunk, _create_retry_decorator
+from langchain_community.utils.openai import is_openai_v1
 from langchain_core.language_models.chat_models import generate_from_stream, agenerate_from_stream
 from langchain_core.messages import AIMessageChunk, get_buffer_string
 from langchain_core.outputs import ChatGenerationChunk
@@ -19,6 +20,25 @@
 from agentuniverse.llm.llm import LLM
 
 
+async def acompletion_with_retry(
+        llm: ChatOpenAI,
+        run_manager: Optional[AsyncCallbackManagerForLLMRun] = None,
+        **kwargs: Any,
+) -> Any:
+    """Use tenacity to retry the async completion call."""
+    if is_openai_v1():
+        return await llm.llm.acall(**kwargs)
+
+    retry_decorator = _create_retry_decorator(llm, run_manager=run_manager)
+
+    @retry_decorator
+    async def _completion_with_retry(**kwargs: Any) -> Any:
+        # Use OpenAI's async api https://github.com/openai/openai-python#async-api
+        return await llm.llm.acall(**kwargs)
+
+    return await _completion_with_retry(**kwargs)
+
+
 class LangchainOpenAIStyleInstance(ChatOpenAI):
     """Langchain OpenAI LLM wrapper."""
 
@@ -134,3 +154,88 @@ async def as_langchain_achunk(stream_iterator: AsyncIterator, run_manager=None)
     def get_num_tokens_from_messages(self, messages: List[BaseMessage]) -> int:
         messages_str = get_buffer_string(messages)
         return self.llm.get_num_tokens(messages_str)
+
+    def completion_with_retry(
+            self, run_manager: Optional[CallbackManagerForLLMRun] = None, **kwargs: Any
+    ) -> Any:
+        """Use tenacity to retry the completion call."""
+        if is_openai_v1():
+            return self.llm.call(**kwargs)
+
+        retry_decorator = _create_retry_decorator(self, run_manager=run_manager)
+
+        @retry_decorator
+        def _completion_with_retry(**kwargs: Any) -> Any:
+            return self.llm.call(**kwargs)
+
+        return _completion_with_retry(**kwargs)
+
+    def _stream(
+            self,
+            messages: List[BaseMessage],
+            stop: Optional[List[str]] = None,
+            run_manager: Optional[CallbackManagerForLLMRun] = None,
+            **kwargs: Any,
+    ) -> Iterator[ChatGenerationChunk]:
+        message_dicts, params = self._create_message_dicts(messages, stop)
+        params = {**params, **kwargs, "stream": True}
+
+        default_chunk_class = AIMessageChunk
+        for chunk in self.completion_with_retry(
+                messages=message_dicts, run_manager=run_manager, **params
+        ):
+            chunk = chunk.raw
+            if not isinstance(chunk, dict):
+                chunk = chunk.dict()
+            if len(chunk["choices"]) == 0:
+                continue
+            choice = chunk["choices"][0]
+            chunk = _convert_delta_to_message_chunk(
+                choice["delta"], default_chunk_class
+            )
+            finish_reason = choice.get("finish_reason")
+            generation_info = (
+                dict(finish_reason=finish_reason) if finish_reason is not None else None
+            )
+            default_chunk_class = chunk.__class__
+            cg_chunk = ChatGenerationChunk(
+                message=chunk, generation_info=generation_info
+            )
+            if run_manager:
+                run_manager.on_llm_new_token(cg_chunk.text, chunk=cg_chunk)
+            yield cg_chunk
+
+    async def _astream(
+            self,
+            messages: List[BaseMessage],
+            stop: Optional[List[str]] = None,
+            run_manager: Optional[AsyncCallbackManagerForLLMRun] = None,
+            **kwargs: Any,
+    ) -> AsyncIterator[ChatGenerationChunk]:
+        message_dicts, params = self._create_message_dicts(messages, stop)
+        params = {**params, **kwargs, "stream": True}
+
+        default_chunk_class = AIMessageChunk
+        async for chunk in await acompletion_with_retry(
+                self, messages=message_dicts, run_manager=run_manager, **params
+        ):
+            chunk = chunk.raw
+            if not isinstance(chunk, dict):
+                chunk = chunk.dict()
+            if len(chunk["choices"]) == 0:
+                continue
+            choice = chunk["choices"][0]
+            chunk = _convert_delta_to_message_chunk(
+                choice["delta"], default_chunk_class
+            )
+            finish_reason = choice.get("finish_reason")
+            generation_info = (
+                dict(finish_reason=finish_reason) if finish_reason is not None else None
+            )
+            default_chunk_class = chunk.__class__
+            cg_chunk = ChatGenerationChunk(
+                message=chunk, generation_info=generation_info
+            )
+            if run_manager:
+                await run_manager.on_llm_new_token(token=cg_chunk.text, chunk=cg_chunk)
+            yield cg_chunk
diff --git a/agentuniverse/llm/openai_style_llm.py b/agentuniverse/llm/openai_style_llm.py
index c4a84da4..2d5a3ea0 100644
--- a/agentuniverse/llm/openai_style_llm.py
+++ b/agentuniverse/llm/openai_style_llm.py
@@ -71,6 +71,8 @@ def call(self, messages: list, **kwargs: Any) -> Union[LLMOutput, Iterator[LLMOu
             **kwargs: Arbitrary keyword arguments.
         """
         streaming = kwargs.pop("streaming") if "streaming" in kwargs else self.streaming
+        if 'stream' in kwargs:
+            streaming = kwargs.pop('stream')
         self.client = self._new_client()
         client = self.client
         chat_completion = client.chat.completions.create(
diff --git a/docs/guidebook/_picture/agent_universe_framework_resize.jpg b/docs/guidebook/_picture/agent_universe_framework_resize.jpg
index 49b98171..85803339 100644
Binary files a/docs/guidebook/_picture/agent_universe_framework_resize.jpg and b/docs/guidebook/_picture/agent_universe_framework_resize.jpg differ
diff --git a/docs/guidebook/_picture/chinese_or_western_medicine.png b/docs/guidebook/_picture/chinese_or_western_medicine.png
new file mode 100644
index 00000000..e611f6ba
Binary files /dev/null and b/docs/guidebook/_picture/chinese_or_western_medicine.png differ
diff --git a/docs/guidebook/_picture/coca-cola_or_pepsi.png b/docs/guidebook/_picture/coca-cola_or_pepsi.png
new file mode 100644
index 00000000..619b98dc
Binary files /dev/null and b/docs/guidebook/_picture/coca-cola_or_pepsi.png differ
diff --git a/docs/guidebook/_picture/law_agent_demo.png b/docs/guidebook/_picture/law_agent_demo.png
new file mode 100644
index 00000000..2f67ec55
Binary files /dev/null and b/docs/guidebook/_picture/law_agent_demo.png differ
diff --git a/docs/guidebook/_picture/react_demo_step.png b/docs/guidebook/_picture/react_demo_step.png
new file mode 100644
index 00000000..84ad6909
Binary files /dev/null and b/docs/guidebook/_picture/react_demo_step.png differ
diff --git a/docs/guidebook/_picture/sweet_or_salted_zongzi.png b/docs/guidebook/_picture/sweet_or_salted_zongzi.png
new file mode 100644
index 00000000..76720c44
Binary files /dev/null and b/docs/guidebook/_picture/sweet_or_salted_zongzi.png differ
diff --git a/docs/guidebook/en/0_index.md b/docs/guidebook/en/0_index.md
index 6ca56443..6fa4e741 100644
--- a/docs/guidebook/en/0_index.md
+++ b/docs/guidebook/en/0_index.md
@@ -21,9 +21,15 @@
   * 2.2.3 [Tool](2_2_3_Tool.md)
     * 2.2.3.1 [Create And Use](2_2_3_Tool_Create_And_Use.md)
     * 2.2.3.2 [Related Domain Objects](2_2_3_Tool_Related_Domain_Objects.md)
-  * 2.2.4 Knowledge
-  * 2.2.5 Memory
-  * 2.2.6 Planner
+  * 2.2.4 [Knowledge](2_2_4_Knowledge.md)
+    * 2.2.4.1 [Define And Use](2_2_4_Knowledge_Define_And_Use.md)
+    * 2.2.4.2 [Related Domain Objects](2_2_4_Knowledge_Related_Domain_Objects.md)
+  * 2.2.5 [Memory](2_2_5_Memory.md)
+    * 2.2.5.1 [Define And Use](2_2_5_Memory_Define_And_Use.md)
+    * 2.2.5.2 [Related Domain Objects](2_2_5_Memory_Related_Domain_Objects.md)
+  * 2.2.6 [Planner](2_2_6_Planner.md)
+    * 2.2.5.1 [Define And Use](2_2_6_Planner_Define_And_Use.md)
+    * 2.2.5.2 [Related Domain Objects](2_2_6_Planner_Related_Domain_Objects.md)
 * 2.3 Technical Components
 * 2.4 Others
   * 2.4.1 Service
@@ -46,6 +52,8 @@
     * 3.1.2.3 [WenXin Usage Instructions](3_1_2_WenXin_LLM_Use.md)
     * 3.1.2.4 [Kimi Usage Instructions](3_1_2_Kimi_LLM_Use.md)
     * 3.1.2.5 [BaiChuan Usage Instructions](3_1_2_BaiChuan_LLM_Use.md)
+    * 3.1.2.6 [Claude Usage Instructions](3_1_2_Claude_LLM_Use.md)
+    * 3.1.2.7 [Ollama Usage Instructions](3_1_2_Ollama_LLM_Use.md)
   * 3.1.3 List of Tools
   * 3.1.4 List of Knowledge
   * 3.1.5 List of Memories
@@ -56,6 +64,7 @@
   * 3.2.2 Store
     * 3.2.2.1 [SQLDBWrapper](2_3_1_SQLDB_WRAPPER.md)
     * 3.2.2.2 [Milvus](3_3_1_Milvus.md)
+    * 3.2.2.3 [ChromaDB](3_3_2_ChromaDB.md)
   * 3.2.3 Msg
   * 3.2.4 Logging
     * 3.2.4.1 [Alibaba Cloud SLS](3_2_4_Alibaba_Cloud_SLS.md)
@@ -67,8 +76,15 @@
   * 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**
+**6. Use Cases**
+* 6.1 RAG-Type Agent Examples
+  * 6.1.1 [Legal Consultation Agent](7_1_1_Legal_Consultation_Case.md)
+* 6.2 ReAct-Type Agent Examples
+  * 6.2.1 [Python Code Generation and Execution Agent](7_1_1_Python_Auto_Runner.md)
+* 6.3 [Discussion Group Based on Multi-Turn Multi-Agent Mode](6_2_1_Discussion_Group.md)
 
-**7. Frequently Asked Questions (FAQ)**
+**7. Series of Articles**
 
-**[8. Contact Us](6_1_Contact_Us.md)**
+**8. Frequently Asked Questions (FAQ)**
+
+**[9. Contact Us](6_1_Contact_Us.md)**
diff --git a/docs/guidebook/en/2_2_3_Tool_Create_And_Use.md b/docs/guidebook/en/2_2_3_Tool_Create_And_Use.md
index e25e0153..3e822188 100644
--- a/docs/guidebook/en/2_2_3_Tool_Create_And_Use.md
+++ b/docs/guidebook/en/2_2_3_Tool_Create_And_Use.md
@@ -53,7 +53,7 @@ def execute(self, tool_input: ToolInput):
 #### An actual example of a tool object definition.
 ```python
 from langchain_community.utilities.google_serper import GoogleSerperAPIWrapper
-from antfinagentframework.agent.action.tool.tool import Tool, ToolInput
+from agentuniverse.agent.action.tool.tool import Tool, ToolInput
 
 class GoogleSearchTool(Tool):
     """The demo google search tool.
@@ -85,6 +85,11 @@ tool = ['sample_standard_app.app.core.tool']
 ```
 
 # How to Use the Tool Component
+## Configure for use in an Agent
+You can set up any tool you have created in the tool of your agent according to the contents of [Agent Creation and Usage section](2_2_1_Agent_Create_And_Use.md).
+
+Refer to the example: `demo_rag_agent`, with the specific file path being `sample_standard_app/app/core/agent/rag_agent_case/demo_rag_agent.yaml`.
+
 ## Using the Tool Manager
 You can obtain the instance of the tool with the corresponding name through the `.get_instance_obj(xx_tool_name)` method in the Tool manager, and call it using the `run` method.
 
diff --git a/docs/guidebook/en/2_2_4_Knowledge.md b/docs/guidebook/en/2_2_4_Knowledge.md
new file mode 100644
index 00000000..95bea78c
--- /dev/null
+++ b/docs/guidebook/en/2_2_4_Knowledge.md
@@ -0,0 +1,11 @@
+# Knowledge
+Data, information, and knowledge are terms that are often confused when mentioned together. Simply put, these three words have a progressively deeper relationship, with knowledge being the most abstract and requiring a high degree of stability and reliability in its content.
+
+We all know that both traditional machine learning models and large language models require a vast amount of data during the training process, and we always hope that this data is of high quality and reliability. Although many existing large language models already include an impressive collection of data and instructions, similar to how no human can become omniscient and omnipotent, these models often have "knowledge" blind spots.
+
+By loading additional knowledge content, agents can learn and master parts of the knowledge that their original LLMs are not proficient in. Just like humans learn knowledge, agents can make themselves more knowledgeable through this method.
+
+agentUniverse defines a standard knowledge format, which includes various knowledge data loading methods, and connections to diverse knowledge storage systems. You can define any form of knowledge data into standard knowledge components for agents and other components to use.
+
+# Conclusion
+By now, you should have a basic understanding of the design principles behind knowledge components. In the next section, we will introduce you to the standard definitions of knowledge components, how to customize and create your own knowledge, and how to utilize knowledge.
\ No newline at end of file
diff --git a/docs/guidebook/en/2_2_4_Knowledge_Define_And_Use.md b/docs/guidebook/en/2_2_4_Knowledge_Define_And_Use.md
new file mode 100644
index 00000000..d2729ab1
--- /dev/null
+++ b/docs/guidebook/en/2_2_4_Knowledge_Define_And_Use.md
@@ -0,0 +1,177 @@
+# How to Define the Knowledge Component
+Based on the design features of agentUniverse domain components, creating a knowledge definition involves two parts:
+
+* knowledge_xx.yaml
+* knowledge_xx.py
+
+The `knowledge_xx.yaml` file contains important information about the knowledge component such as its name, description, loading method, storage method, etc., while the `knowledge_xx.py` file contains the specific definitions of the knowledge. Understanding this principle, let's delve into how to create these two parts.
+
+## Creating the Knowledge Configuration - knowledge_xx.yaml
+We will detail the various components in the configuration.
+
+### Setting Basic Attributes of Knowledge
+* `name`:  The name of the knowledge, which you can set to any name you prefer.
+* `description`:  A description of the knowledge, filled according to your actual needs.
+* `store`: The storage medium for the knowledge (e.g., ChromaStore, RedisStore, FaissStore, etc.)
+* `reader`: Represents the method of reading the knowledge (e.g., FileReader, UrlReader, etc.)
+* `ext_info`: Extended parameters
+
+### Setting Knowledge Component Metadata
+**`metadata` - Component Metadata**
+* `type` : Component type, 'KNOWLEDGE'
+* `module`: The package path of the knowledge entity
+* `class`: The class name of the knowledge entity
+
+### A Sample Knowledge Configuration
+```yaml
+name: 'demo_knowledge'
+description: 'demo knowledge'
+metadata:
+  type: 'KNOWLEDGE'
+  module: 'sample_standard_app.app.core.knowledge.demo_knowledge'
+  class: 'DemoKnowledge'
+```
+
+The above is an actual sample of a Knowledge configuration. 
+
+Besides, the standard configuration items introduced above, you can find more knowledge configuration YAML samples in our sample project under the path `sample_standard_app.app.core.knowledge`. 
+
+Additionally, agentUniverse does not restrict users from extending the knowledge YAML configuration content. You can create any custom configuration keys according to your requirements, but please be mindful not to use the same names as the default configuration keywords mentioned above.
+
+## Creating the Knowledge Domain Behavior Definition - knowledge_xx.py
+
+### Creating a Knowledge Class Object
+Create the corresponding Knowledge class object and inherit the base class Knowledge from the agentUniverse framework. 
+
+### Setting Up the Reader Module
+The Reader module is responsible for reading the knowledge, and this part is optional. agentUniverse currently has built-in Readers for the following data formats:
+
+* DocxReader
+* PdfReader
+* PptxReader
+* WebPdfReader
+* FileReader
+
+Their paths are located under `agentuniverse.agent.action.knowledge.reader.file`. The Reader module supports customization, and you can write your own Reader's loading methods.
+
+### Setting Up the Store Module
+The Store module is responsible for the persistence interaction of the knowledge, performing operations like insertion, reading, deletion, and updating of the knowledge. This part is optional as well. agentUniverse currently has built-in Stores for the following data formats:
+
+* ChromaStore
+* MilvusStore
+
+Their paths are located under `agentuniverse.agent.action.knowledge.store`. The Store module supports customization, and you can write your own Store's loading methods.
+
+### Defining the query_knowledge Method
+This method is responsible for querying the corresponding knowledge. Its default implementation uses the Store function queries, but users can override it based on their actual needs.
+
+```python
+def query_knowledge(self, **kwargs) -> List[Document]:
+    """Query the knowledge.
+
+    Query documents from the store and return the results.
+    """
+    query = Query(**kwargs)
+    return self.store.query(query)
+```
+
+### Defining the insert_knowledge Method
+This method is responsible for adding new pieces of knowledge, with its default implementation utilizing the insertion operation of the Store function. Users have the flexibility to override this behavior based on their specific requirements.
+
+```python
+def insert_knowledge(self, **kwargs) -> None:
+    """Insert the knowledge.
+
+    Load data by the reader and insert the documents into the store.
+    """
+    document_list: List[Document] = self.reader.load_data()
+    self.store.insert_documents(document_list, **kwargs)
+```
+
+#### A Sample Knowledge Object Definition
+```python
+from agentuniverse.agent.action.knowledge.embedding.openai_embedding import OpenAIEmbedding
+from agentuniverse.agent.action.knowledge.knowledge import Knowledge
+from agentuniverse.agent.action.knowledge.reader.file.web_pdf_reader import WebPdfReader
+from agentuniverse.agent.action.knowledge.store.chroma_store import ChromaStore
+from agentuniverse.agent.action.knowledge.store.document import Document
+from langchain.text_splitter import TokenTextSplitter
+
+SPLITTER = TokenTextSplitter(chunk_size=800, chunk_overlap=100)
+
+
+class DemoKnowledge(Knowledge):
+    """The demo knowledge."""
+
+    def __init__(self, **kwargs):
+        """The __init__ method.
+
+        Some parameters, such as name and description,
+        are injected into this class by the demo_knowledge.yaml configuration.
+
+
+        Args:
+            name (str): Name of the knowledge.
+
+            description (str): Description of the knowledge.
+
+            store (Store): Store of the knowledge, store class is used to store knowledge
+            and provide retrieval capabilities, such as ChromaDB store or Redis Store,
+            demo knowledge uses ChromaDB as the knowledge storage.
+
+            reader (Reader): Reader is used to load data,
+            the demo knowledge uses WebPdfReader to load pdf files from web.
+        """
+        super().__init__(**kwargs)
+        self.store = ChromaStore(collection_name="chroma_store", embedding_model=OpenAIEmbedding(
+            embedding_model_name='text-embedding-3-small'), dimensions=1056)
+        self.reader = WebPdfReader()
+        # initialize the knowledge
+        # self.insert_knowledge()
+
+    def insert_knowledge(self, **kwargs) -> None:
+        """Insert the knowledge into the knowledge store.
+
+        Step1: Load data from the web using WebPdfReader.
+        Step2: Split the data into chunks using TokenTextSplitter().
+        Step3: Insert the data into the ChromaStore.
+
+        Note:
+            To avoid that the token in the embedding process exceeds the limit, the document needs to be split.
+        """
+        doc_list = self.reader.load_data('https://www.sfu.ca/~poitras/BUFFET.pdf')
+        lc_doc_list = SPLITTER.split_documents(Document.as_langchain_list(doc_list))
+        self.store.insert_documents(Document.from_langchain_list(lc_doc_list))
+```
+
+## Take Note of the Path Where Your Knowledge Is Located
+With the above Knowledge configuration and definition steps, you have mastered all the steps for creating knowledge. Next, we will use this knowledge. Before use, please ensure that the created Knowledge is in the correct package scan path.
+
+In the config.toml file of the agentUniverse project, you need to configure the package corresponding to the Knowledge configuration. Please reconfirm whether the package path of the created file is under the `CORE_PACKAGE`'s `knowledge` path or its subpaths.
+
+For example, in the configuration of the sample project, it is as follows:
+```yaml
+[CORE_PACKAGE]
+# Scan and register knowledge components for all paths under this list, with priority over the default.
+knowledge = ['sample_standard_app.app.core.knowledge']
+```
+
+# How to Use the Knowledge Component
+## Configuring Use in the Agent
+Based on the content in [Creating and Using Agents](2_2_1_Agent_Create_And_Use.md), you can set any created knowledge under the knowledge action in the agent.
+
+## Using the Knowledge Manager
+You can obtain the Knowledge instance corresponding to the name via the `.get_instance_obj(xx_knowledge_name)` method in the Knowledge Manager, and call it using the `query_knowledge` method.
+
+```python
+from agentuniverse.agent.action.knowledge.knowledge_manager import KnowledgeManage
+
+knowledge = KnowledgeManager().get_instance_obj(knowledge_name)
+knowledge.query_knowledge(**query_input)
+```
+
+# Learn More About Existing Knowledge
+For more knowledge examples provided by the framework, you can check the `sample_standard_app.app.core.knowledge` package path.
+
+# Conclusion
+Now you have mastered the definition and use of the Knowledge component. Go ahead and try creating and using your knowledge.
\ No newline at end of file
diff --git a/docs/guidebook/en/2_2_4_Knowledge_Related_Domain_Objects.md b/docs/guidebook/en/2_2_4_Knowledge_Related_Domain_Objects.md
new file mode 100644
index 00000000..574c12e2
--- /dev/null
+++ b/docs/guidebook/en/2_2_4_Knowledge_Related_Domain_Objects.md
@@ -0,0 +1,17 @@
+# Knowledge and Related Domain Objects
+In this chapter, we will focus on listing the Knowledge and related core domain objects. We have omitted their corresponding code parts. If you would like to learn more, please refer to the [API Reference Section](4_1_API_Reference.md).
+
+## Knowledge Base Class
+Package Path:`agentuniverse.agent.action.knowledge.knowledge.Knowledge`
+
+## Knowledge Manager
+Package Path:`agentuniverse.agent.action.knowledge.knowledge_manager.KnowledgeManager`
+
+## Embedding Object Base Class
+Package Path:`agentuniverse.agent.action.knowledge.embedding.embedding.Embedding`
+
+## Reader Object Base Class
+Package Path:`agentuniverse.agent.action.knowledge.reader.reader.Reader`
+
+## Store Object Base Class
+Package Path:`agentuniverse.agent.action.knowledge.store.store.Store`
\ No newline at end of file
diff --git a/docs/guidebook/en/2_2_5_Memory.md b/docs/guidebook/en/2_2_5_Memory.md
new file mode 100644
index 00000000..4ae0985b
--- /dev/null
+++ b/docs/guidebook/en/2_2_5_Memory.md
@@ -0,0 +1,16 @@
+# Memory
+Memory is a crucial component for an agent, enabling it to remember past events. In most conversational and task scenarios, we expect the agent to incorporate historical information in its responses and interactions. Although the agent's LLM inherently has a conversation length window limitation, memory effectively addresses this issue.
+
+Similar to human memory, an agent's memory can be simply categorized into the following types:
+
+* Short-term Memory: Contextual information from all interactions with the agent.
+
+* Long-term Memory: Summarizes or persistently stores the agent’s context in real-time, ensuring continuous provision of long-term memory.
+
+In this definition process, we find that memory itself depends on a series of technologies, such as vector storage and fast retrieval.
+
+Furthermore, aside from providing agents with context-based capabilities, memory offers numerous observable functions. For example, by mining and processing memory, we can distill it into experiential knowledge. Memory can also record the agent's entire operation process, capturing user "preferences," among other things.
+
+
+# Conclusion
+With this, you have a preliminary understanding of the role of memory. In the next section, we will specifically introduce the standard definitions of memory components, how to create custom memories, and how to use memory.
\ No newline at end of file
diff --git a/docs/guidebook/en/2_2_5_Memory_Define_And_Use.md b/docs/guidebook/en/2_2_5_Memory_Define_And_Use.md
new file mode 100644
index 00000000..52d08d89
--- /dev/null
+++ b/docs/guidebook/en/2_2_5_Memory_Define_And_Use.md
@@ -0,0 +1,69 @@
+# How to Define the Memory Component
+The current version of the agentUniverse memory component includes default memory capabilities, and we are in the process of upgrading it. Therefore, we will not detail this part for now. If you are interested in the current memory design, you can refer to the `agentuniverse.agent.memory.memory.Memory` object. In future versions, we will enable the ability to customize memory, and we will update this part of the documentation accordingly.
+
+# How to Use the Memory Component
+## Configuring Memory in the Agent
+Following the [Creating and Using Agents](2_2_1_Agent_Create_And_Use.md) guide, you can set up your memory instance in the agent's memory section. The current version of aU includes a default memory type, which you can configure as follows:
+```yaml
+info:
+  name: 'demo_rag_agent'
+  description: 'demo rag agent'
+profile:
+  introduction: You are an AI assistant skilled in information analysis.
+  target: Your goal is to assess whether the answers to questions provide valuable information and to give recommendations and evaluations on the answers.
+  instruction: |
+    The rules you need to abide by are:
+    1. Always answer users' questions in Chinese, combining it with the background information you have.
+    2. Structure the answers well and use blank lines to enhance readability when necessary.
+    3. Do not use incorrect information from the background.
+    4. Consider the relevance of the answer to the question and avoid unhelpful responses.
+    5. Provide thorough answers, highlight the key points, and avoid excessive verbosity.
+    6. Avoid vague speculation.
+    7. Use numerical information as much as possible.
+    Background information is:
+    {background}
+  
+    Previous conversation:
+    {chat_history}
+    
+    Let's 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'
+memory:
+  name: 'default_memory'
+metadata:
+  type: 'AGENT'
+  module: 'sample_standard_app.app.core.agent.rag_agent_case.demo_rag_agent'
+  class: 'DemoRagAgent'
+```
+
+Currently, agentUniverse only provides the default_memory type. This memory type will retrieve the chat_history keyword from the conversation, and automatically summarize the memory when its length exceeds a certain threshold.
+
+## Passing chat_history when Calling the Agent
+When invoking the agent, you can pass the chat_history parameter, such as:
+
+```text
+chat_history=[{"content": "Hello", "type": "human"}, {"content": "Hello", "type": "ai"}]
+```
+
+The default_memory instance will retrieve this parameter during agent execution and process the memory accordingly throughout the agent's execution process.
+
+## Using the Memory Manager
+You can get the Memory instance corresponding to its name using the `.get_instance_obj(xx_memory_name)` method in the Memory Manager.
+
+```python
+from agentuniverse.agent.memory.memory_manager import MemoryManager
+
+memory = MemoryManager().get_instance_obj(component_instance_name=memory_name, new_instance=True)
+```
+
+# Conclusion
+Now you have mastered the method of using the Memory component. Go ahead and try using Memory.
\ No newline at end of file
diff --git a/docs/guidebook/en/2_2_5_Memory_Related_Domain_Objects.md b/docs/guidebook/en/2_2_5_Memory_Related_Domain_Objects.md
new file mode 100644
index 00000000..8c18ce35
--- /dev/null
+++ b/docs/guidebook/en/2_2_5_Memory_Related_Domain_Objects.md
@@ -0,0 +1,8 @@
+# Memory and Related Domain Objects
+In this chapter, we will focus on listing the Memory and related core domain objects. We have omitted their corresponding code parts. If you would like to learn more, please refer to the [API Reference Section](4_1_API_Reference.md).
+
+## Memory Base Class
+Package Path:`agentuniverse.agent.memory.memory.Memory`
+
+## Memory Manager
+Package Path:`agentuniverse.agent.memory.memory_manager.MemoryManager`
\ No newline at end of file
diff --git a/docs/guidebook/en/2_2_6_Planner.md b/docs/guidebook/en/2_2_6_Planner.md
new file mode 100644
index 00000000..1cba8aec
--- /dev/null
+++ b/docs/guidebook/en/2_2_6_Planner.md
@@ -0,0 +1,5 @@
+# Planner
+Planners influence the collaboration and execution strategies of actual agents. As we mentioned earlier, agentUniverse can be viewed as a Pattern Factory, and Planners are the practical carriers of the collaboration and execution philosophies of these patterns. Planners can encompass various types, such as making the agent adhere to a fully human-orchestrated workflow, follow a specific Standard Operating Procedure (SOP), or use certain specific models of operation like PEER/Retrieval-Augmented Generation (RAG), or even allow the agent to work completely autonomously (Auto).
+
+# Conclusion
+At this point, you have a preliminary understanding of the role of planning. In the next section, we will specifically introduce the standard definitions of planning components, how to create custom plans, and how to use plans.
\ No newline at end of file
diff --git a/docs/guidebook/en/2_2_6_Planner_Define_And_Use.md b/docs/guidebook/en/2_2_6_Planner_Define_And_Use.md
new file mode 100644
index 00000000..6979676b
--- /dev/null
+++ b/docs/guidebook/en/2_2_6_Planner_Define_And_Use.md
@@ -0,0 +1,203 @@
+# How to Define a Planner Component
+Based on the design features of agentUniverse domain components, creating a Planner definition involves two parts, similar to other components:
+
+* planner_xx.yaml
+* planner_xx.py
+The `planner_xx.yaml` file contains important information about the Planner component, such as its name, description, input, output, etc. The `planner_xx.py` file contains the specific behavior definitions of the Planner. With this understanding, let's see how to create these two parts in detail.
+
+## Creating the Planner Configuration - planner_xx.yaml
+We will detail the various components in the configuration.
+
+### Setting Basic Attributes of the Planner
+* `name`:  The name of the Planner, which can be set to any unique identifier you prefer.
+* `description`:  A description of the Planner
+* `input_key`: Defaults to "input," represents the key for actual input
+* `output_key`: Defaults to "output," represents the key for actual output
+
+### Setting Planner Component Metadata
+**`metadata` - Component Metadata**
+* `type` : Component type, 'PLANNER'
+* `module`: The package path of the Planner entity
+* `class`: The class name of the Planner entity
+
+### A Sample Planner Configuration
+```yaml
+name: 'expressing_planner'
+description: 'expressing planner'
+metadata:
+  type: 'PLANNER'
+  module: 'agentuniverse.agent.plan.planner.expressing_planner.expressing_planner'
+  class: 'ExpressingPlanner'
+```
+
+The above is an actual sample of a Planner configuration. 
+
+Besides, the standard configuration items mentioned above, you can find more planner configuration YAML samples in the `agentuniverse.agent.plan.planner` path in the project. 
+
+Additionally, agentUniverse does not restrict users from extending the Planner YAML configuration content. You can create any custom configuration keys according to your requirements, but please be mindful not to use the same names as the default configuration keywords mentioned above.
+
+## Creating the Planner Domain Behavior Definition - planner_xx.py
+
+### Create the Planner Class Object
+Create the corresponding Planner class object and inherit the base class Planner from the agentUniverse framework.
+
+### Implement the Invoke Method in the Planner Class Object
+Write the actual logic fragments for the plan in the `invoke` method.
+
+```text
+def invoke(self, agent_model: AgentModel, planner_input: dict, input_object: InputObject) -> dict:
+    """Invoke the planner.
+
+    Args:
+        agent_model (AgentModel): Agent model object.
+        planner_input (dict): Planner input object.
+        input_object (InputObject): The input parameters passed by the user.
+    Returns:
+        dict: The planner result.
+    """
+    planner_config = agent_model.plan.get('planner')
+    sub_agents = self.generate_sub_agents(planner_config)
+    return self.agents_run(sub_agents, planner_config, planner_input, input_object)
+```
+
+The above example uses a peer planner to illustrate, where it selects the various sub-agents in PEER mode and runs them accordingly. We will elaborate further on the working principles of PEER in its respective section.
+
+Similarly, the following non-mandatory methods will not be elaborated here. It is recommended to refer to an actual planner source code for a comprehensive understanding, such as `agentuniverse.agent.plan.planner.planning_planner.planning_planner`.
+
+### Implement the handle_prompt Method
+The `handle_prompt` method handles prompt processing within the planner. It is optional.
+
+### Implement the handle_memory Method
+The `handle_memory` method handles memory processing within the planner. It is optional.
+
+### Implement the handle_all_actions Method
+The `handle_all_actions` method handles all action processing within the planner. It is optional.
+
+### Implement the handle_llm Method
+The `handle_llm` method handles LLM processing within the planner. It is optional.
+
+#### A Sample Planner Object Definition
+```python
+import asyncio
+
+from langchain_core.chat_history import InMemoryChatMessageHistory
+from langchain_core.runnables.history import RunnableWithMessageHistory
+
+from agentuniverse.agent.agent_model import AgentModel
+from agentuniverse.agent.input_object import InputObject
+from agentuniverse.agent.memory.chat_memory import ChatMemory
+from agentuniverse.agent.plan.planner.planner import Planner
+from agentuniverse.base.util.memory_util import generate_memories
+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
+
+
+class RagPlanner(Planner):
+    """Rag planner class."""
+
+    def invoke(self, agent_model: AgentModel, planner_input: dict,
+               input_object: InputObject) -> dict:
+        """Invoke the planner.
+
+        Args:
+            agent_model (AgentModel): Agent model object.
+            planner_input (dict): Planner input object.
+            input_object (InputObject): The input parameters passed by the user.
+        Returns:
+            dict: The planner result.
+        """
+        memory: ChatMemory = self.handle_memory(agent_model, planner_input)
+
+        self.run_all_actions(agent_model, planner_input, input_object)
+
+        llm: LLM = self.handle_llm(agent_model)
+
+        prompt: ChatPrompt = self.handle_prompt(agent_model, planner_input)
+        process_llm_token(llm, prompt.as_langchain(), agent_model.profile, planner_input)
+
+        chat_history = memory.as_langchain().chat_memory if memory else InMemoryChatMessageHistory()
+
+        chain_with_history = RunnableWithMessageHistory(
+            prompt.as_langchain() | llm.as_langchain(),
+            lambda session_id: chat_history,
+            history_messages_key="chat_history",
+            input_messages_key=self.input_key,
+        )
+        res = asyncio.run(
+            chain_with_history.ainvoke(input=planner_input, config={"configurable": {"session_id": "unused"}}))
+        return {**planner_input, self.output_key: res.content, 'chat_history': generate_memories(chat_history)}
+
+    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:
+            ChatPrompt: The chat prompt instance.
+        """
+        profile: dict = agent_model.profile
+
+        profile_prompt_model: AgentPromptModel = AgentPromptModel(introduction=profile.get('introduction'),
+                                                                  target=profile.get('target'),
+                                                                  instruction=profile.get('instruction'))
+
+        # get the prompt by the prompt version
+        prompt_version: str = profile.get('prompt_version')
+        version_prompt: Prompt = PromptManager().get_instance_obj(prompt_version)
+
+        if version_prompt is None and not profile_prompt_model:
+            raise Exception("Either the `prompt_version` or `introduction & target & instruction`"
+                            " in agent profile configuration should be provided.")
+        if version_prompt:
+            version_prompt_model: AgentPromptModel = AgentPromptModel(
+                introduction=getattr(version_prompt, 'introduction', ''),
+                target=getattr(version_prompt, 'target', ''),
+                instruction=getattr(version_prompt, 'instruction', ''))
+            profile_prompt_model = profile_prompt_model + version_prompt_model
+
+        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
+```
+
+The above is an actual sample based on the Rag planner. Further details will be provided in the section introducing the Rag planner.
+
+## Make Sure Your Planner is in the Correct Package Path
+With the above Planner configuration and definition, you have learned all the steps for creating a Planner. Next, we will use these Planners. Before using them, ensure the created Planner is in the correct package scan path.
+
+In the config.toml file of the agentUniverse project, you need to configure the package corresponding to the Planner configuration. Please confirm whether the package path of the created file is under the `CORE_PACKAGE`'s `planner` path or its subpaths. 
+
+Here is an example configuration from the sample project:
+
+```yaml
+[CORE_PACKAGE]
+# Scan and register planner components for all paths under this list, with priority over the default.
+planner = ['sample_standard_app.app.core.planner']
+```
+
+# How to Use the Planner Component
+## Configuring Use in the Agent
+Following the [Creating and Using Agents guide](2_2_1_Agent_Create_And_Use.md), you can set up any created Planner component in the agent's planner section. Refer to the example: `demo_rag_agent`, with the specific file path `sample_standard_app/app/core/agent/rag_agent_case/demo_rag_agent.yaml`.
+
+## Using the Planner Manager
+You can get the Planner instance corresponding to its name using the `.get_instance_obj(xx_planner_name)` method in the Planner Manager and call it using the `invoke` method.
+
+```python
+from agentuniverse.agent.plan.planner.planner_manager import PlannerManager
+
+planner_base = PlannerManager().get_instance_obj('xx_planner_name')
+planner_result = planner_base.invoke(self.agent_model, agent_input, input_object)
+```
+
+# Learn More About Existing Planner Components
+You can find more Planner components in the `agentuniverse.agent.plan.planner` package path. You can further check the corresponding code or learn more about them in our extension component introduction section. For more integrated Planners, you can refer to the Planner list chapter.
+
+# Conclusion
+Now you have mastered the definition and use of Planners. Go ahead and try defining and using your own Planners.
\ No newline at end of file
diff --git a/docs/guidebook/en/2_2_6_Planner_Related_Domain_Objects.md b/docs/guidebook/en/2_2_6_Planner_Related_Domain_Objects.md
new file mode 100644
index 00000000..5e75afc1
--- /dev/null
+++ b/docs/guidebook/en/2_2_6_Planner_Related_Domain_Objects.md
@@ -0,0 +1,8 @@
+# Planner and Related Domain Objects
+In this chapter, we will focus on listing the Planner and related core domain objects. We have omitted their corresponding code parts. If you would like to learn more, please refer to the [API Reference Section](4_1_API_Reference.md).
+
+## Planner Base Class
+Package Path:`agentuniverse.agent.plan.planner.planner.Planner`
+
+## Planner Manager
+Package Path:`agentuniverse.agent.plan.planner.planner_manager.PlannerManager`
\ No newline at end of file
diff --git a/docs/guidebook/en/3_1_2_0_List_Of_LLMs.md b/docs/guidebook/en/3_1_2_0_List_Of_LLMs.md
index 5d5975eb..a56aa83f 100644
--- a/docs/guidebook/en/3_1_2_0_List_Of_LLMs.md
+++ b/docs/guidebook/en/3_1_2_0_List_Of_LLMs.md
@@ -8,7 +8,9 @@ The platform has currently integrated the following list of models; please refer
 | [WenXin](3_1_2_WenXin_LLM_Use.md)     |
 | [Kimi](3_1_2_Kimi_LLM_Use.md)         |
 | [BaiChuan](3_1_2_BaiChuan_LLM_Use.md) |
+| [Claude](3_1_2_Claude_LLM_Use.md)     |
+| [ollama](3_1_2_Ollama_LLM_Use.md)     |
 
 For LLM not included in the list, you can customize the integration of any LLM according to the steps provided in the [LLM definition](2_2_3_Tool_Create_And_Use.md).
 
-At the same time, we are adding the integration methods for common LLMs such as Claude, Gemini, ollama, Llama, ZhipuAI, etc. If you have used these LLMs in your projects and have created your own instances, we welcome you to submit a PR to become a contributor to agentUniverse.
\ No newline at end of file
+At the same time, we are adding the integration methods for common LLMs such as Gemini, Llama, ZhipuAI, etc. If you have used these LLMs in your projects and have created your own instances, we welcome you to submit a PR to become a contributor to agentUniverse.
\ No newline at end of file
diff --git a/docs/guidebook/en/3_1_2_Claude_LLM_Use.md b/docs/guidebook/en/3_1_2_Claude_LLM_Use.md
new file mode 100644
index 00000000..b18de2fd
--- /dev/null
+++ b/docs/guidebook/en/3_1_2_Claude_LLM_Use.md
@@ -0,0 +1,34 @@
+# Calude Usage
+## 1. Create the relevant file.
+Create a YAML file, for example, user_claude.yaml
+Paste the following content into your user_claude.yaml file.
+```yaml
+name: 'user_claude_llm'
+description: 'user claude llm with spi'
+model_name: 'claude-3-opus-20240229'
+max_tokens: 4096
+metadata:
+  type: 'LLM'
+  module: 'agentuniverse.llm.default.claude_llm'
+  class: 'ClaudeLLM'
+```
+## 2. Environment Setup
+Must be configured: ANTHROPIC_API_KEY  
+Optional: ANTHROPIC_API_URL
+### 2.1 Configure through Python code
+```python
+import os
+os.environ['ANTHROPIC_API_KEY'] = 'sk-***'
+os.environ['ANTHROPIC_API_URL'] = 'https://xxxxxx'
+```
+### 2.2 Configure through the configuration file
+In the custom_key.toml file under the config directory of the project, add the configuration:
+```toml
+ANTHROPIC_API_KEY="sk-******"
+ANTHROPIC_API_URL="https://xxxxxx"
+```
+## 3. Obtaining the ANTHROPIC API KEY
+Reference Claude Official Documentation: https://docs.anthropic.com/zh-CN/docs/getting-access-to-claude
+
+## 4. Note
+In agentuniverse, we have already created an llm with the name default_claude_llm. After configuring the ANTHROPIC_API_KEY, users can directly use it.
\ No newline at end of file
diff --git a/docs/guidebook/en/3_1_2_Ollama_LLM_Use.md b/docs/guidebook/en/3_1_2_Ollama_LLM_Use.md
new file mode 100644
index 00000000..cce2b0e6
--- /dev/null
+++ b/docs/guidebook/en/3_1_2_Ollama_LLM_Use.md
@@ -0,0 +1,32 @@
+# Ollama Usage
+## 1. Create the relevant file.
+Create a YAML file, for example, user_ollama.yaml
+Paste the following content into your user_ollama.yaml file.
+```yaml
+name: 'user_ollama_llm'
+description: 'user ollama llm with spi'
+model_name: 'qwen2:7b'
+max_tokens: 1000
+max_context_length: 32000
+metadata:
+  type: 'LLM'
+  module: 'agentuniverse.llm.default.default_ollama_llm'
+  class: 'OllamaLLM'
+```
+## 2. Environment Setup
+### 2.1 Configure through Python code
+Must be configured: OLLAMA_BASE_URL
+```python
+import os
+os.environ['OLLAMA_BASE_URL'] = 'https://xxxxxx'
+```
+### 2.2 Configure through the configuration file
+In the custom_key.toml file under the config directory of the project, add the configuration:
+```toml
+OLLAMA_BASE_URL="https://xxxxxx"
+```
+
+## 4. Tips
+In agentuniverse, we have already created an llm with the name default_ollama_llm. After configuring the OLLAMA_BASE_URL, users can directly use it.
+Reference: https://www.ollama.com/library/qwen2
+
diff --git a/docs/guidebook/en/3_3_1_Milvus.md b/docs/guidebook/en/3_3_1_Milvus.md
index a0c83538..cc23c7ae 100644
--- a/docs/guidebook/en/3_3_1_Milvus.md
+++ b/docs/guidebook/en/3_3_1_Milvus.md
@@ -18,7 +18,8 @@ pip install pymilvus
 ```
 
 ### What can I do with Milvus
-You can use Milvus in the Knowledge component to store and query knowledge. You can create a storage component using Milvus as follows:
+
+You can use Milvus in the [Knowledge component](2_2_4_Knowledge.md) to store and query knowledge. You can create a storage component using Milvus as follows:
 
 ```python
 from agentuniverse.agent.action.knowledge.store.milvus_store import MilvusStore
@@ -37,4 +38,5 @@ init_params['store'] = MilvusStore(
 )
 knowledge = Knowledge(**init_params)
 ```
-The above code will create a Milvus-based Knowledge instance. For detailed usage of Knowledge, you can refer to the [Knowledge documentation]() or the code `tests/test_agentuniverse/unit/agent/action/knowledge/test_knowledge_with_milvus.py`.
\ No newline at end of file
+
+The above code will create a Milvus-based Knowledge instance. For detailed usage of Knowledge, you can refer to the [Knowledge component](2_2_4_Knowledge.md) or the code `tests/test_agentuniverse/unit/agent/action/knowledge/test_knowledge_with_milvus.py`.
diff --git a/docs/guidebook/en/3_3_2_ChromaDB.md b/docs/guidebook/en/3_3_2_ChromaDB.md
new file mode 100644
index 00000000..d48ffc2b
--- /dev/null
+++ b/docs/guidebook/en/3_3_2_ChromaDB.md
@@ -0,0 +1,24 @@
+## ChromaDB
+
+The agentUniverse already integrates ChromaDB-related dependencies, so you do not need to install additional packages to use ChromaDB's features.
+If you want to learn about the underlying principles of ChromaDB, you can visit the [official ChromaDB website](https://www.trychroma.com/).
+
+### What can I do with ChromaDB?
+
+
+You can use ChromaDB in the [Knowledge component](2_2_4_Knowledge.md) to store and query knowledge. You can create a storage component using ChromaDB with the following method:
+```python
+from agentuniverse.agent.action.knowledge.embedding.openai_embedding import OpenAIEmbedding
+from agentuniverse.agent.action.knowledge.knowledge import Knowledge
+from agentuniverse.agent.action.knowledge.store.chroma_store import ChromaStore
+
+
+init_params = dict()
+init_params['name'] = 'test_knowledge'
+init_params['description'] = 'test_knowledge_description'
+init_params['store'] = ChromaStore(collection_name="test_knowledge", embedding_model=OpenAIEmbedding(
+    embedding_model_name='text-embedding-ada-002'))
+knowledge = Knowledge(**init_params)
+```
+
+The above code will create a Knowledge component based on ChromaDB. For more details on how to use the Knowledge component, you can refer to the [Knowledge component](2_2_4_Knowledge.md)，or check the code in `tests/test_agentuniverse/unit/agent/action/knowledge/test_knowledge.py`。
diff --git a/docs/guidebook/en/6_2_1_Discussion_Group.md b/docs/guidebook/en/6_2_1_Discussion_Group.md
index e0d19a7d..bf8ee3c7 100644
--- a/docs/guidebook/en/6_2_1_Discussion_Group.md
+++ b/docs/guidebook/en/6_2_1_Discussion_Group.md
@@ -66,6 +66,10 @@ def chat(question: str):
 if __name__ == '__main__':
     chat("Which tastes better, Coca-Cola or Pepsi")
 ```
+### Result Demonstration
+Which tastes better, Coca-Cola or Pepsi：
+
+![Picture](../_picture/coca-cola_or_pepsi.png)
 
 ## More Details
 ### Agent Configuration
diff --git a/docs/guidebook/en/7_1_1_Legal_Consultation_Case.md b/docs/guidebook/en/7_1_1_Legal_Consultation_Case.md
new file mode 100644
index 00000000..14782290
--- /dev/null
+++ b/docs/guidebook/en/7_1_1_Legal_Consultation_Case.md
@@ -0,0 +1,35 @@
+# Legal Consultation Case
+## Case Description
+This case is based on RagPlanner and builds a simple legal consultation agent. It provides relevant legal advice by retrieving related articles from the Civil Code and Criminal Law and combining them with the case background.
+
+This case utilizes the Qianwen large model and the DashScope embedding feature. Before using it, you need to configure the DASHSCOPE_API_KEY in your environment variables.
+
+## Components
+### Legal Knowledge Base
+The legal knowledge base is based on the [Knowledge Component ](2_2_4_知识.md) in agentUniverse. By embedding the original text of legal articles and storing them in the ChromaDB vector database, it creates a knowledge base that the agent can easily reference and retrieve.  
+Original legal texts:
+- [Civil Code.pdf](../../../sample_standard_app/app/resources/民法典.pdf)
+- [Criminal Law.pdf](../../../sample_standard_app/app/resources/刑法.pdf)
+
+You can refer to the following code:
+- [Civil Code Knowledge Base](../../../sample_standard_app/app/core/knowledge/civil_law_knowledge.py)
+- [Criminal Law Knowledge Base](../../../sample_standard_app/app/core/knowledge/criminal_law_knowledge.py)
+
+To make it convenient for you, we have placed the database files with relevant information in [this directory](../../../sample_standard_app/DB/), If you want to build the knowledge base from scratch, you can modify the following part of the code:
+```python
+# Initialize the knowledge
+# self.insert_knowledge()
+```
+Remove the comment from self.insert_knowledge() to rebuild the database.
+
+### Law Agent
+This agent involves the following two files:
+- [law_rag_agent.py](../../../sample_standard_app/app/core/agent/rag_agent_case/law_rag_agent.py): Defines the agent's input and output
+- [law_rag_agent.yaml](../../../sample_standard_app/app/core/agent/rag_agent_case/law_rag_agent.yaml): Defines the agent's related prompts
+
+
+### Demonstration Code
+[CodeLink](../../../sample_standard_app/app/examples/law_chat_bot.py)
+
+## Demonstration
+![Demonstration Image](../_picture/law_agent_demo.png)
\ No newline at end of file
diff --git a/docs/guidebook/en/7_1_1_Python_Auto_Runner.md b/docs/guidebook/en/7_1_1_Python_Auto_Runner.md
new file mode 100644
index 00000000..1832cf62
--- /dev/null
+++ b/docs/guidebook/en/7_1_1_Python_Auto_Runner.md
@@ -0,0 +1,73 @@
+# Python Auto Runner
+## Case Illustration
+This case is based on ReactPlanner, building a simple case that can automatically generate and execute Python code.
+This case is based on the QianWen large language model and the google_search function, requiring you to configure the environment variables DASHSCOPE_API_KEY, SERPER_API_KEY before use.
+
+## Quick Start
+### Configure API Key
+For example, configure key information in the file custom_key.toml where agentUniverse manages private keys (the default discussion group uses qwen as the base model and serper as the google search tool).
+```toml
+[KEY_LIST]
+# serper google search key
+SERPER_API_KEY='xxx'
+# openai api key
+DASHSCOPE_API_KEY='xxx'
+```
+
+### Agent Configuration
+```yaml
+info:
+  name: 'demo_react_agent'
+  description: 'react agent'
+profile:
+  prompt_version: qwen_react_agent.cn
+  llm_model:
+    name: 'default_qwen_llm'
+    model_name : 'qwen-max'
+    temperature: 0
+action:
+  tool:
+    - 'google_search_tool'
+    - 'python_runner'
+plan:
+  planner:
+    name: 'react_planner'
+metadata:
+  type: 'AGENT'
+  module: 'agentuniverse.agent.default.react_agent.react_agent'
+  class: 'ReActAgent'
+```
+
+Here we used two tools: google_search_tool and python_runner. The relevant tool code links are as follows:
+- [google_search_tool](../../../sample_standard_app/app/core/tool/google_search_tool.yaml)
+- [python_runner](../../../sample_standard_app/app/core/tool/python_repl_tool.yaml)
+
+
+### Case Run
+1. Test Case Run
+Directly run with test code[test_case](../../../sample_standard_app/app/test/test_react_agent.py)
+2. Interface Run
+After configuring the related keys, start the web service and use the following curl for testing.
+```shell
+curl --location --request POST 'http://localhost:8888/service_run' \
+--header 'Cookie: spanner=fQ47DxJmWYzf8rKDhs69LExySZYZFUiVXt2T4qEYgj0' \
+--header 'Content-Type: application/json' \
+--data-raw '{
+    
+    "service_id": "demo_react_service",
+    "params": {
+        "input": "请帮我生成一段python代码，可以计算三数之和"
+    }
+}'
+```
+
+### Result
+![test_case](../_picture/react_demo_step.png)
+
+In the image, React went through three steps in total:  
+Step 1: The model provided a piece of Python code and handed it over to the Python Runner tool for execution, but the execution failed due to the failure to use print to output the execution result.  
+Step 2: The model realized the mistake and proactively modified the code. It then used the Python Runner tool again for execution, which was successful.  
+Step 3: The model conveyed the successfully executed code to the user.  
+
+### Please note
+Due to limitations of the model's capabilities, it is recommended to use the qwen-max model for testing.
\ No newline at end of file
diff --git "a/docs/guidebook/zh/0_\347\233\256\345\275\225.md" "b/docs/guidebook/zh/0_\347\233\256\345\275\225.md"
index 4090dd06..43a9b654 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"
@@ -25,9 +25,15 @@
   * 2.2.3 [工具(Tool)](2_2_3_工具.md)
     * 2.2.3.1 [工具创建与使用](2_2_3_工具创建与使用.md)
     * 2.2.3.2 [工具及相关领域对象](2_2_3_工具及相关领域对象.md)
-  * 2.2.4 知识(Knowledge)
-  * 2.2.5 记忆(Memory)
-  * 2.2.6 计划(Planner)
+  * 2.2.4 [知识(Knowledge)](2_2_4_知识.md)
+    * 2.2.4.1 [知识定义与使用](2_2_4_知识定义与使用.md)
+    * 2.2.4.2 [知识及相关领域对象](2_2_4_知识及相关领域对象.md)
+  * 2.2.5 [记忆(Memory)](2_2_5_记忆.md)
+    * 2.2.5.1 [记忆定义与使用](2_2_5_记忆定义与使用.md)
+    * 2.2.5.2 [记忆及相关领域对象](2_2_5_记忆及相关领域对象.md)
+  * 2.2.6 [计划(Planner)](2_2_6_计划.md)
+    * 2.2.6.1 [计划定义与使用](2_2_6_计划定义与使用.md)
+    * 2.2.6.2 [计划及相关领域对象](2_2_6_计划及相关领域对象.md)
 * 2.3 技术组件
 * 2.4 其他
   * 2.4.1 服务化
@@ -50,16 +56,19 @@
     * 3.1.2.3 [文心一言使用说明](3_1_2_文心使用.md)
     * 3.1.2.4 [Kimi使用说明](3_1_2_Kimi使用.md)
     * 3.1.2.5 [百川使用说明](3_1_2_百川使用.md)
+    * 3.1.2.6 [Claude使用说明](3_1_2_Claude使用.md)
+    * 3.1.2.7 [Ollama使用说明](3_1_2_Ollama使用.md)
   * 3.1.3 工具列表(Tool)
   * 3.1.4 知识列表(Knowledge)
   * 3.1.5 记忆列表(Memory)
-  * 3.1.6 规划列表(Planner)
+  * 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.2.1 [SQLDBWrapper](2_3_1_SQLDB_WRAPPER.md)
     * 3.2.2.2 [Milvus](3_3_1_Milvus.md)
+    * 3.2.2.3 [ChromaDB](3_3_2_ChromaDB.md)
   * 3.2.3 消息(Msg)
   * 3.2.4 日志(Logging)
     * 3.2.4.1 [阿里云SLS](3_2_4_阿里云SLS.md)
@@ -71,8 +80,15 @@
   * 5.1.1 [Docker容器化方案](5_1_1_Docker容器化部署.md)
   * 5.1.2 [K8S部署方案](5_1_2_K8S部署.md)
 
-**6.系列文章**
+**6.使用案例**
+* 6.1 RAG类Agent案例
+  * 6.1.1 [法律咨询Agent](7_1_1_法律咨询案例.md)
+* 6.2 ReAct类Agent案例
+  * 6.2.1 [Python代码生成与执行Agent](7_1_1_Python自动执行案例.md)
+* 6.3 [基于多轮多Agent的讨论小组](6_2_1_讨论组.md)
 
-**7.常见问题FAQ**
+**7.系列文章**
 
-**[8.联系我们](6_1_联系我们.md)**
+**8.常见问题FAQ**
+
+**[9.联系我们](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 2a26e9e3..3dbdf961 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"
@@ -107,7 +107,7 @@ metadata:
   module: 'sample_standard_app.app.core.agent.rag_agent_case.demo_rag_agent'
   class: 'DemoRagAgent'
 ```
-在`xx_agent_case_a.yaml`中，我们定义了一个`DemoRagAgent`的配置。`info`部分是agent的基本信息设置，`profile`部分包含了agent使用llm模型设置 ，`plan`部分包含了agent的行为规划设置(决定了agent的工作模式)，`action`部分包含了agent可使用的工具及知识设置，`metadata`部分包含了agent对象的元数据设置。
+在`xx_agent_case_a.yaml`中，我们定义了一个`DemoRagAgent`的配置。`info`部分是agent的基本信息设置，`profile`部分包含了agent使用llm模型设置 ，`plan`部分包含了agent的行为计划设置(决定了agent的工作模式)，`action`部分包含了agent可使用的工具及知识设置，`metadata`部分包含了agent对象的元数据设置。
 
 ### 创建agent对象
 创建一个同名的`xx_agent_case_a.py`文件，内容样例如下：
@@ -161,7 +161,7 @@ metadata:
   class: 'DemoPeerAgent'
 ```
 
-在`xx_agent_case_b.yaml`中，我们定义了一个`DemoPeerAgent`的配置。`info`部分是agent的基本信息设置，`plan`部分包含了agent的行为规划设置(决定了agent的工作模式)，`metadata`部分包含了agent对象的元数据设置。
+在`xx_agent_case_b.yaml`中，我们定义了一个`DemoPeerAgent`的配置。`info`部分是agent的基本信息设置，`plan`部分包含了agent的行为计划设置(决定了agent的工作模式)，`metadata`部分包含了agent对象的元数据设置。
 
 其中`plan`部分的`planner`字段定义了一个`peer_planner`的配置，其中`planning`、`executing`、`expressing`和`reviewing`字段分别定义了PEER的四个环节的agent配置。您可以继续创建每个环节对应的子agent，每个子agent的配置又可以采用不同的agent pattern模式。
 
diff --git "a/docs/guidebook/zh/2_2_3_\345\267\245\345\205\267\345\210\233\345\273\272\344\270\216\344\275\277\347\224\250.md" "b/docs/guidebook/zh/2_2_3_\345\267\245\345\205\267\345\210\233\345\273\272\344\270\216\344\275\277\347\224\250.md"
index 9961fc92..272f4a26 100644
--- "a/docs/guidebook/zh/2_2_3_\345\267\245\345\205\267\345\210\233\345\273\272\344\270\216\344\275\277\347\224\250.md"
+++ "b/docs/guidebook/zh/2_2_3_\345\267\245\345\205\267\345\210\233\345\273\272\344\270\216\344\275\277\347\224\250.md"
@@ -53,8 +53,7 @@ def execute(self, tool_input: ToolInput):
 #### 一个实际的tool对象定义样例
 ```python
 from langchain_community.utilities.google_serper import GoogleSerperAPIWrapper
-from antfinagentframework.agent.action.tool.tool import Tool, ToolInput
-
+from agentuniverse.agent.action.tool.tool import Tool, ToolInput
 
 class GoogleSearchTool(Tool):
     """The demo google search tool.
@@ -86,6 +85,11 @@ tool = ['sample_standard_app.app.core.tool']
 ```
 
 # 如何使用工具Tool组件
+## 在Agent中配置使用
+您可以根据[智能体创建与使用](2_2_1_智能体创建与使用.md)中的内容在agent的action下的tool中设置您创建的任意工具。
+
+可参考示例：`demo_rag_agent`， 具体文件路径为 `sample_standard_app/app/core/agent/rag_agent_case/demo_rag_agent.yaml`。
+
 ## 使用Tool管理器
 通过Tool管理器中的`.get_instance_obj(xx_tool_name)` 方法可以获取对应名称的Tool实例, 使用`run`方法进行调用。
 
diff --git "a/docs/guidebook/zh/2_2_4_\347\237\245\350\257\206.md" "b/docs/guidebook/zh/2_2_4_\347\237\245\350\257\206.md"
new file mode 100644
index 00000000..6fbf6fb4
--- /dev/null
+++ "b/docs/guidebook/zh/2_2_4_\347\237\245\350\257\206.md"
@@ -0,0 +1,11 @@
+# 知识(Knowledge)
+数据、信息、知识，当这几个词同时出现时往往容易混淆含义，简单来说这三个词有着层层递进的关系，知识的抽象程度最高，对于内容有很强的稳定性与可靠性要求。
+
+我们都知道无论是传统的机器学习模型还是大语言模型在训练的过程中都需要大量的数据，我们总是希望这些数据是高质量与可靠的。尽管现有的许多大语言模型在面向用户时已经包含了非常惊人的数据与指令集合，但是就同人是不可能变得全知全能一样，大语言模型往往也拥着"知识"盲区。
+
+通过额外加载的知识内容，Agent可以学习与掌握原本其LLM并不擅长的知识部分，同人类学习知识一样，Agent通过这一方式让自己变得更加有知。
+
+agentUniverse定义了标准的知识定义，其包含了各类知识数据的加载方式，也包含了去连接那些各种各样的知识存储，您可以将任何任何形式的知识数据定义成标准的知识组件供agent与其他组件使用。
+
+# 总结
+至此您已初步了解知识组件的设计原理，在下一节我们将具体向您介绍知识组件的标准定义、如何自定义创建知识、如何使用知识等。
diff --git "a/docs/guidebook/zh/2_2_4_\347\237\245\350\257\206\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_4_\347\237\245\350\257\206\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..a5b81160
--- /dev/null
+++ "b/docs/guidebook/zh/2_2_4_\347\237\245\350\257\206\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 @@
+# 知识与相关领域对象
+在本章节我们会重点列出Knowledge与相关的核心领域对象, 我们省略了其对应的代码部分，若您希望进一步了解请阅读对应的[API参考部分](4_1_API参考.md)。
+
+## Knowledge基础类
+包路径：`agentuniverse.agent.action.knowledge.knowledge.Knowledge`
+
+## Knowledge管理器
+包路径：`agentuniverse.agent.action.knowledge.knowledge_manager.KnowledgeManager`
+
+## Embedding对象基础类
+包路径：`agentuniverse.agent.action.knowledge.embedding.embedding.Embedding`
+
+## Reader对象基础类
+包路径：`agentuniverse.agent.action.knowledge.reader.reader.Reader`
+
+## Store对象基础类
+包路径：`agentuniverse.agent.action.knowledge.store.store.Store`
\ No newline at end of file
diff --git "a/docs/guidebook/zh/2_2_4_\347\237\245\350\257\206\345\256\232\344\271\211\344\270\216\344\275\277\347\224\250.md" "b/docs/guidebook/zh/2_2_4_\347\237\245\350\257\206\345\256\232\344\271\211\344\270\216\344\275\277\347\224\250.md"
new file mode 100644
index 00000000..6a17c889
--- /dev/null
+++ "b/docs/guidebook/zh/2_2_4_\347\237\245\350\257\206\345\256\232\344\271\211\344\270\216\344\275\277\347\224\250.md"
@@ -0,0 +1,178 @@
+# 如何定义知识Knowledge组件
+根据agentUniverse领域组件的设计特性，同其他组件一样，创建一个知识knowledge定义由2部分组成:
+* knowledge_xx.yaml
+* knowledge_xx.py
+
+其中`knowledge_xx.yaml`包含了Knowledge组件的名称、描述、加载方式、存储方式等重要信息；`knowledge_xx.py`包含了的知识具体定义。理解这一原理后，让我们具体看看该如何创建这两部分内容。
+
+## 创建Knowledge配置 - knowledge_xx.yaml
+我们将详细介绍配置中的各组成部分。
+
+### 设置Knowledge的基本属性
+* `name`:  知识名称，您可以按照自己的期望设置任何名字
+* `description`:  知识描述, 按照您的实际需求填写
+* `store`: 知识的存储媒介（比如ChromaStore/RedisStore/FaissStore等）
+* `reader`: 代表知识的读取方式（比如FileReader/UrlReader等）
+* `ext_info`: 扩展参数
+
+### 设置Knowledge组件元信息
+**`metadata` - 组件元信息**
+* `type` : 组件类型，'KNOWLEDGE'
+* `module`: 知识实体包路径
+* `class`: 知识实体类名
+
+### 一个Knowledge定义配置的实际样例
+```yaml
+name: 'demo_knowledge'
+description: 'demo knowledge'
+metadata:
+  type: 'KNOWLEDGE'
+  module: 'sample_standard_app.app.core.knowledge.demo_knowledge'
+  class: 'DemoKnowledge'
+```
+
+上述是一个实际的Knowledge配置的样例。除了上述介绍的标准配置项。
+
+您可以在我们的样例工程中的`sample_standard_app.app.core.knowledge`路径下更多的knowledge配置yaml样例。
+
+除此之外agentuniverse不限制用户对knowledge yaml配置内容进行扩展，您可以根据自己的要求创建任何自定义配置key,但请注意不要与上述默认的配置关键字重名。
+
+## 创建Knowledge领域行为定义 - knowledge_xx.py
+
+### 创建Knowledge类对象
+创建对应的Knowledge类对象并继承agentUniverse框架Knowledge基础类 `Knowledge`;
+
+### 设定Reader模块
+Reader模块的作用是做知识的读取，这部分是可选的。
+
+agentUniverse目前内置了如下数据格式的Reader：
+* DocxReader
+* PdfReader
+* PptxReader
+* WebPdfReader
+* FileReader
+
+其路径位于`agentuniverse.agent.action.knowledge.reader.file`包路径下，Reader模块是支持定制的，您可以自行编写Reader的加载方式。
+
+### 设定Store模块
+Store模块的作用负责知识持久化交互，做知识的插入/读取/删除/更新等操作，这部分是可选的。。
+
+agentUniverse目前内置了如下数据格式的Store：
+* ChromaStore
+* MilvusStore
+
+其路径位于`agentuniverse.agent.action.knowledge.store`包路径下，Store模块是支持定制的，您可以自行编写Store的加载方式。
+
+### 定义query_knowledge方法
+该方法负责对应知识的查询，其默认实现为使用Store函数的查询，用户可以根据实际情况进行覆写。
+
+```python
+def query_knowledge(self, **kwargs) -> List[Document]:
+    """Query the knowledge.
+
+    Query documents from the store and return the results.
+    """
+    query = Query(**kwargs)
+    return self.store.query(query)
+```
+
+### 定义insert_knowledge方法
+该方法负责对应知识的新增，其默认实现为使用Store函数的插入，用户可以根据实际情况进行覆写。
+
+```python
+def insert_knowledge(self, **kwargs) -> None:
+    """Insert the knowledge.
+
+    Load data by the reader and insert the documents into the store.
+    """
+    document_list: List[Document] = self.reader.load_data()
+    self.store.insert_documents(document_list, **kwargs)
+```
+
+#### 一个实际的Knowledge对象定义样例
+```python
+from agentuniverse.agent.action.knowledge.embedding.openai_embedding import OpenAIEmbedding
+from agentuniverse.agent.action.knowledge.knowledge import Knowledge
+from agentuniverse.agent.action.knowledge.reader.file.web_pdf_reader import WebPdfReader
+from agentuniverse.agent.action.knowledge.store.chroma_store import ChromaStore
+from agentuniverse.agent.action.knowledge.store.document import Document
+from langchain.text_splitter import TokenTextSplitter
+
+SPLITTER = TokenTextSplitter(chunk_size=800, chunk_overlap=100)
+
+
+class DemoKnowledge(Knowledge):
+    """The demo knowledge."""
+
+    def __init__(self, **kwargs):
+        """The __init__ method.
+
+        Some parameters, such as name and description,
+        are injected into this class by the demo_knowledge.yaml configuration.
+
+
+        Args:
+            name (str): Name of the knowledge.
+
+            description (str): Description of the knowledge.
+
+            store (Store): Store of the knowledge, store class is used to store knowledge
+            and provide retrieval capabilities, such as ChromaDB store or Redis Store,
+            demo knowledge uses ChromaDB as the knowledge storage.
+
+            reader (Reader): Reader is used to load data,
+            the demo knowledge uses WebPdfReader to load pdf files from web.
+        """
+        super().__init__(**kwargs)
+        self.store = ChromaStore(collection_name="chroma_store", embedding_model=OpenAIEmbedding(
+            embedding_model_name='text-embedding-3-small'), dimensions=1056)
+        self.reader = WebPdfReader()
+        # initialize the knowledge
+        # self.insert_knowledge()
+
+    def insert_knowledge(self, **kwargs) -> None:
+        """Insert the knowledge into the knowledge store.
+
+        Step1: Load data from the web using WebPdfReader.
+        Step2: Split the data into chunks using TokenTextSplitter().
+        Step3: Insert the data into the ChromaStore.
+
+        Note:
+            To avoid that the token in the embedding process exceeds the limit, the document needs to be split.
+        """
+        doc_list = self.reader.load_data('https://www.sfu.ca/~poitras/BUFFET.pdf')
+        lc_doc_list = SPLITTER.split_documents(Document.as_langchain_list(doc_list))
+        self.store.insert_documents(Document.from_langchain_list(lc_doc_list))
+```
+
+## 关注您定义的Knowledge所在的包路径
+通过上面的Knowledge配置与定义，您已经掌握了知识创建的所有步骤；接下去我们将使用这些Knowledge，在使用前请关注创建的Knowledge是否在正确的包扫描路径内。
+
+在agentUniverse项目的config.toml中需要配置Knowledge配置对应的package, 请再次确认您创建的文件所在的包路径是否在`CORE_PACKAGE`中`knowledge`路径或其子路径下。
+
+以示例工程中的配置为例，如下：
+```yaml
+[CORE_PACKAGE]
+# Scan and register knowledge components for all paths under this list, with priority over the default.
+knowledge = ['sample_standard_app.app.core.knowledge']
+```
+
+# 如何使用知识Knowledge组件
+## 在Agent中配置使用
+您可以根据[智能体创建与使用](2_2_1_智能体创建与使用.md)中的内容在agent的action下的knowledge中设置您创建的任意知识。
+
+## 使用Knowledge管理器
+通过Knowledge管理器中的`.get_instance_obj(xx_knowledge_name)` 方法可以获取对应名称的Knowledge实例, 使用`query_knowledge`方法进行调用。
+
+```python
+from agentuniverse.agent.action.knowledge.knowledge_manager import KnowledgeManage
+
+knowledge = KnowledgeManager().get_instance_obj(knowledge_name)
+knowledge.query_knowledge(**query_input)
+```
+
+# 了解更多已有知识Knowledge
+框架提供的更多Knowledge示例在`sample_standard_app.app.core.knowledge`包路径下，您可以进一步查看对应的知识。
+
+# 总结
+至此您已经掌握了知识Knowledge的定义与使用，赶快去尝试创建与使用知识吧。
\ No newline at end of file
diff --git "a/docs/guidebook/zh/2_2_5_\350\256\260\345\277\206.md" "b/docs/guidebook/zh/2_2_5_\350\256\260\345\277\206.md"
new file mode 100644
index 00000000..4fb424d9
--- /dev/null
+++ "b/docs/guidebook/zh/2_2_5_\350\256\260\345\277\206.md"
@@ -0,0 +1,13 @@
+# 记忆(Memory)
+对于智能体而言记忆是非常重要的一个组成部分，它让智能体能够记住发生过的事。在绝大部分对话与任务场景中，我们希望智能体能够结合历史信息进行解答与交流。尽管Agent的LLM本身具有会话长度窗口限制，但是记忆非常好地弥补了这一问题。
+
+同人类的记忆一样，智能体的记忆可以简单分为下列两类：
+* 短期记忆: 所有Agent交互过程中的上下文信息
+* 长期记忆: 将Agent的上下文实时进行总结处理或持久化，始终保证长期的记忆提供
+
+在这个定义过程中我们会发现，记忆其本身的定义外，还会依赖如向量存储、快速检索等一些列技术的依赖；
+
+此外，记忆除了上述提到的给智能体提供基于长短期上下文能力外，记忆还可提供非常多可观的作用。例如：通过对于记忆进行挖掘与处理，我们可以将记忆沉淀为经验知识；记忆可以记录与智能体的全部运行过程记录用户的"偏好"等等。
+
+# 总结
+至此您已初步了解记忆的作用，在下一节我们将具体向您介绍记忆组件的标准定义、如何自定义创建记忆、如何使用记忆等。
\ No newline at end of file
diff --git "a/docs/guidebook/zh/2_2_5_\350\256\260\345\277\206\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_5_\350\256\260\345\277\206\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..75cd064b
--- /dev/null
+++ "b/docs/guidebook/zh/2_2_5_\350\256\260\345\277\206\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,8 @@
+# 记忆与相关领域对象
+在本章节我们会重点列出Memory与相关的核心领域对象, 我们省略了其对应的代码部分，若您希望进一步了解请阅读对应的[API参考部分](4_1_API参考.md)。
+
+## Memory基础类
+包路径：`agentuniverse.agent.memory.memory.Memory`
+
+## Memory管理器
+包路径：`agentuniverse.agent.memory.memory_manager.MemoryManager`
\ No newline at end of file
diff --git "a/docs/guidebook/zh/2_2_5_\350\256\260\345\277\206\345\256\232\344\271\211\344\270\216\344\275\277\347\224\250.md" "b/docs/guidebook/zh/2_2_5_\350\256\260\345\277\206\345\256\232\344\271\211\344\270\216\344\275\277\347\224\250.md"
new file mode 100644
index 00000000..386ea213
--- /dev/null
+++ "b/docs/guidebook/zh/2_2_5_\350\256\260\345\277\206\345\256\232\344\271\211\344\270\216\344\275\277\347\224\250.md"
@@ -0,0 +1,71 @@
+# 如何定义记忆Memory组件
+agentUniverse当前版本的记忆组件包含了记忆的默认能力，我们正在对其进行升级改造，在此我们先不详细介绍这部分内容。如果您对于当前的记忆设计感兴趣可以关注`agentuniverse.agent.memory.memory.Memory`对象。在后续的版本中，我们会开放记忆定制的能力，那时我们会更新这部分文档内容。
+
+# 如何使用记忆Memory组件
+## 在Agent中配置使用
+您可以根据[智能体创建与使用](2_2_1_智能体创建与使用.md)中的内容在agent的memory中设置您的memory实例。当前aU包含了默认的memory类型，您可以这样设置：
+```yaml
+info:
+  name: 'demo_rag_agent'
+  description: 'demo rag agent'
+profile:
+  introduction: 你是一位精通信息分析的ai助手。
+  target: 你的目标是判断问题对应的答案是否提供了有价值的信息，并对问题的答案做出建议和评价。
+  instruction: |
+    你需要遵守的规则是:
+    1. 必须使用中文结合查询的背景信息结合你所拥有的知识回答用户提出的问题。
+    2. 结构化答案生成，必要时通过空行提升阅读体验。
+    3. 不采用背景信息中的错误信息。
+    4. 要考虑答案和问题的相关性，不做对问题没有帮助的回答。
+    5. 详尽回答问题，重点突出，不过多花哨词藻。
+    6. 不说模糊的推测。
+    7. 尽量多的使用数值类信息。
+
+    背景信息是:
+    {background}
+  
+    之前的对话:
+    {chat_history}
+    
+    开始!
+
+    需要回答的问题是: {input}
+  llm_model:
+    name: 'demo_llm'
+    model_name: 'gpt-4o'
+plan:
+  planner:
+    name: 'rag_planner'
+action:
+  tool:
+    - 'google_search_tool'
+memory:
+  name: 'default_memory'
+metadata:
+  type: 'AGENT'
+  module: 'sample_standard_app.app.core.agent.rag_agent_case.demo_rag_agent'
+  class: 'DemoRagAgent'
+```
+
+目前agentUniverse只开放了default_memory类型, 该记忆类型会将会话中的chat_history关键字进行获取，同时当记忆的长度超过阈值时会自动进行记忆的总结。
+
+## 在调用Agent时传入chat_history
+在调用agent时您可以传入chat_history参数，如：
+
+```text
+chat_history=[{"content": "你好", "type": "human"}, {"content": "你好", "type": "ai"}]
+```
+
+该参数会agent执行时被default_memory实例获取并进行后续的记忆处理，使用到agent的执行过程中。
+
+## 使用Memory管理器
+通过Memory管理器中的`.get_instance_obj(xx_memory_name)` 方法可以获取对应名称的Memory内容。
+
+```python
+from agentuniverse.agent.memory.memory_manager import MemoryManager
+
+memory = MemoryManager().get_instance_obj(component_instance_name=memory_name, new_instance=True)
+```
+
+# 总结
+至此您已经掌握了记忆Memory的使用方法，赶快去尝试使用Memory吧。
\ No newline at end of file
diff --git "a/docs/guidebook/zh/2_2_6_\350\256\241\345\210\222.md" "b/docs/guidebook/zh/2_2_6_\350\256\241\345\210\222.md"
new file mode 100644
index 00000000..bb2e649c
--- /dev/null
+++ "b/docs/guidebook/zh/2_2_6_\350\256\241\345\210\222.md"
@@ -0,0 +1,5 @@
+# 计划(Planner)
+Planner影响实际Agent工作时的协作与执行策略，我们在介绍时曾说明agentUniverse可以视为一个Pattern Factory，Planners是pattern的协作与执行思想的实际载体。Planner将包含多种类型，例如让Agent遵从完全由人工编排的工作流程（workflow）、遵从某一个标准作业流程（SOP）、或使用某些特定模式的工作方式如PEER/检索增强模式（RAG）、或让智能体完全自主工作(Auto)。
+
+# 总结
+至此您已初步了解计划的作用，在下一节我们将具体向您介绍计划组件的标准定义、如何自定义创建计划、如何使用计划等。
\ No newline at end of file
diff --git "a/docs/guidebook/zh/2_2_6_\350\256\241\345\210\222\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_6_\350\256\241\345\210\222\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..7ba0484a
--- /dev/null
+++ "b/docs/guidebook/zh/2_2_6_\350\256\241\345\210\222\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,8 @@
+# 计划与相关领域对象
+在本章节我们会重点列出Planner与相关的核心领域对象, 我们省略了其对应的代码部分，若您希望进一步了解请阅读对应的[API参考部分](4_1_API参考.md)。
+
+## Planner基础类
+包路径：`agentuniverse.agent.plan.planner.planner.Planner`
+
+## Planner管理器
+包路径：`agentuniverse.agent.plan.planner.planner_manager.PlannerManager`
\ No newline at end of file
diff --git "a/docs/guidebook/zh/2_2_6_\350\256\241\345\210\222\345\256\232\344\271\211\344\270\216\344\275\277\347\224\250.md" "b/docs/guidebook/zh/2_2_6_\350\256\241\345\210\222\345\256\232\344\271\211\344\270\216\344\275\277\347\224\250.md"
new file mode 100644
index 00000000..1b8485cc
--- /dev/null
+++ "b/docs/guidebook/zh/2_2_6_\350\256\241\345\210\222\345\256\232\344\271\211\344\270\216\344\275\277\347\224\250.md"
@@ -0,0 +1,204 @@
+# 如何定义计划Planner组件
+根据agentUniverse领域组件的设计特性，同其他组件一样，创建一个计划Planner定义由2部分组成:
+* planner_xx.yaml
+* planner_xx.py
+
+其中`planner_xx.yaml`包含了Planner组件的名称、描述、输入、输出等重要信息；`planner_xx.py`包含了的Planner的具体行为定义。理解这一原理后，让我们具体看看该如何创建这两部分内容。
+
+## 创建Planner配置 - planner_xx.yaml
+我们将详细介绍配置中的各组成部分。
+
+### 设置Planner的基本属性
+* `name`:  Planner名称，您可以按照自己的期望设置任何名字,唯一标识
+* `description`:  planner的描述说明
+* `input_key`: 默认为input，实际输入对应的key
+* `output_key`: 默认为output，实际输出对应的key
+
+### 设置Planner组件元信息
+**`metadata` - 组件元信息**
+* `type` : 组件类型，'PLANNER'
+* `module`: Planner实体包路径
+* `class`: Planner实体类名
+
+### 一个Planner定义配置的实际样例
+```yaml
+name: 'expressing_planner'
+description: 'expressing planner'
+metadata:
+  type: 'PLANNER'
+  module: 'agentuniverse.agent.plan.planner.expressing_planner.expressing_planner'
+  class: 'ExpressingPlanner'
+```
+
+上述是一个实际的Planner配置的样例。除了上述介绍的标准配置项。
+
+您可以在工程中的`agentuniverse.agent.plan.planner`路径下查看更多的planner配置yaml样例。
+
+除此之外agentuniverse不限制用户对Planner yaml配置内容进行扩展，您可以根据自己的要求创建任何自定义配置key,但请注意不要与上述默认的配置关键字重名。
+
+## 创建Planner领域行为定义 - planner_xx.py
+
+### 创建Planner类对象
+创建对应的Planner类对象并继承agentUniverse框架Planner基础类 `Planner`;
+
+### 编写Planner类对象invoke方法
+在`invoke`方法中编写计划的实际逻辑片段。
+
+```text
+def invoke(self, agent_model: AgentModel, planner_input: dict, input_object: InputObject) -> dict:
+    """Invoke the planner.
+
+    Args:
+        agent_model (AgentModel): Agent model object.
+        planner_input (dict): Planner input object.
+        input_object (InputObject): The input parameters passed by the user.
+    Returns:
+        dict: The planner result.
+    """
+    planner_config = agent_model.plan.get('planner')
+    sub_agents = self.generate_sub_agents(planner_config)
+    return self.agents_run(sub_agents, planner_config, planner_input, input_object)
+```
+
+上述案例以peer planner作为说明，其选择了peer中的各个子agent，并按照peer的模式进行运行。在peer的说明部分我们会进一步详细介绍peer的工作原理，这里我们不展开说明。
+
+同理，下面的非必须方法我们在此也不详细介绍了，建议您以一个实际的planner源码作为参考结合观看，例如`'agentuniverse.agent.plan.planner.planning_planner.planning_planner'`.
+
+### 编写handle_prompt方法
+在`handle_prompt`方法中编写planner中关于prompt处理的方法，非必须。
+
+### 编写handle_memory方法
+在`handle_memory`方法中编写planner中关于memory处理的方法，非必须。
+
+### 编写handle_all_actions方法
+在`handle_all_actions`方法中编写planner中关于所有action的处理的方法，非必须。
+
+### 编写handle_llm方法
+在`handle_llm`方法中编写planner中关于llm处理的方法，非必须。
+
+#### 一个实际的planner对象定义样例
+```python
+import asyncio
+
+from langchain_core.chat_history import InMemoryChatMessageHistory
+from langchain_core.runnables.history import RunnableWithMessageHistory
+
+from agentuniverse.agent.agent_model import AgentModel
+from agentuniverse.agent.input_object import InputObject
+from agentuniverse.agent.memory.chat_memory import ChatMemory
+from agentuniverse.agent.plan.planner.planner import Planner
+from agentuniverse.base.util.memory_util import generate_memories
+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
+
+
+class RagPlanner(Planner):
+    """Rag planner class."""
+
+    def invoke(self, agent_model: AgentModel, planner_input: dict,
+               input_object: InputObject) -> dict:
+        """Invoke the planner.
+
+        Args:
+            agent_model (AgentModel): Agent model object.
+            planner_input (dict): Planner input object.
+            input_object (InputObject): The input parameters passed by the user.
+        Returns:
+            dict: The planner result.
+        """
+        memory: ChatMemory = self.handle_memory(agent_model, planner_input)
+
+        self.run_all_actions(agent_model, planner_input, input_object)
+
+        llm: LLM = self.handle_llm(agent_model)
+
+        prompt: ChatPrompt = self.handle_prompt(agent_model, planner_input)
+        process_llm_token(llm, prompt.as_langchain(), agent_model.profile, planner_input)
+
+        chat_history = memory.as_langchain().chat_memory if memory else InMemoryChatMessageHistory()
+
+        chain_with_history = RunnableWithMessageHistory(
+            prompt.as_langchain() | llm.as_langchain(),
+            lambda session_id: chat_history,
+            history_messages_key="chat_history",
+            input_messages_key=self.input_key,
+        )
+        res = asyncio.run(
+            chain_with_history.ainvoke(input=planner_input, config={"configurable": {"session_id": "unused"}}))
+        return {**planner_input, self.output_key: res.content, 'chat_history': generate_memories(chat_history)}
+
+    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:
+            ChatPrompt: The chat prompt instance.
+        """
+        profile: dict = agent_model.profile
+
+        profile_prompt_model: AgentPromptModel = AgentPromptModel(introduction=profile.get('introduction'),
+                                                                  target=profile.get('target'),
+                                                                  instruction=profile.get('instruction'))
+
+        # get the prompt by the prompt version
+        prompt_version: str = profile.get('prompt_version')
+        version_prompt: Prompt = PromptManager().get_instance_obj(prompt_version)
+
+        if version_prompt is None and not profile_prompt_model:
+            raise Exception("Either the `prompt_version` or `introduction & target & instruction`"
+                            " in agent profile configuration should be provided.")
+        if version_prompt:
+            version_prompt_model: AgentPromptModel = AgentPromptModel(
+                introduction=getattr(version_prompt, 'introduction', ''),
+                target=getattr(version_prompt, 'target', ''),
+                instruction=getattr(version_prompt, 'instruction', ''))
+            profile_prompt_model = profile_prompt_model + version_prompt_model
+
+        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
+```
+
+上述是一个基于Rag planner的实际样例，我们在此不展开说明，可以关注rag planner介绍部分。
+
+## 关注您定义的Planner所在的包路径
+通过上面的Planner配置与定义，您已经掌握了Planner创建的所有步骤；接下去我们将使用这些Planner，在使用前请关注创建的Planner是否在正确的包扫描路径内。
+
+在agentUniverse项目的config.toml中需要配置Planner配置对应的package, 请再次确认您创建的文件所在的包路径是否在`CORE_PACKAGE`中`planner`路径或其子路径下。
+
+以示例工程中的配置为例，如下：
+```yaml
+[CORE_PACKAGE]
+# Scan and register planner components for all paths under this list, with priority over the default.
+planner = ['sample_standard_app.app.core.planner']
+```
+
+# 如何使用计划Planner组件
+## 在Agent中配置使用
+您可以根据[智能体创建与使用](2_2_1_智能体创建与使用.md)中的内容在agent的planner中设置您创建的任意计划组件。
+
+可参考示例：`demo_rag_agent`， 具体文件路径为 `sample_standard_app/app/core/agent/rag_agent_case/demo_rag_agent.yaml`。
+
+## 使用Planner管理器
+通过Planner管理器中的`.get_instance_obj(xx_planner_name)` 方法可以获取对应名称的Planner实例, 通过`invoke`方法进行调用。
+
+```python
+from agentuniverse.agent.plan.planner.planner_manager import PlannerManager
+
+planner_base = PlannerManager().get_instance_obj('xx_planner_name')
+planner_result = planner_base.invoke(self.agent_model, agent_input, input_object)
+```
+
+# 了解更多已有计划Planner组件
+框架提供的更多Planner组件在`agentuniverse.agent.plan.planner`包路径下，您可以进一步查看对应代码或在我们的扩展组件介绍部分进一步了解他们，更多已经接入的Planner您可以在Planner列表章节中了解。
+
+# 总结
+至此您已经掌握了计划Planner的定义与使用，赶快去尝试定义与使用Planner吧。
\ No newline at end of file
diff --git "a/docs/guidebook/zh/3_1_2_0_\346\250\241\345\236\213\345\210\227\350\241\250.md" "b/docs/guidebook/zh/3_1_2_0_\346\250\241\345\236\213\345\210\227\350\241\250.md"
index 4791894c..5e62a724 100644
--- "a/docs/guidebook/zh/3_1_2_0_\346\250\241\345\236\213\345\210\227\350\241\250.md"
+++ "b/docs/guidebook/zh/3_1_2_0_\346\250\241\345\236\213\345\210\227\350\241\250.md"
@@ -1,14 +1,16 @@
 # 模型（LLM）列表
 目前平台已经接入了如下模型列表，详细使用方式请关注本章节各LLM的说明。
 
-| 模型LLM(系列)名称                  |
-|------------------------------|
-| [OpenAI](3_1_2_OpenAI使用.md)  |
-| [通义千问](3_1_2_Qwen使用.md)      |
-| [文心一言](3_1_2_文心使用.md)        |
-| [Kimi](3_1_2_Kimi使用.md)      |
-| [百川](3_1_2_百川使用.md)          |
+| 模型LLM(系列)名称                      |
+|----------------------------------|
+| [OpenAI](3_1_2_OpenAI使用.md)      |
+| [通义千问](3_1_2_Qwen使用.md)          |
+| [文心一言](3_1_2_文心使用.md)            |
+| [Kimi](3_1_2_Kimi使用.md)          |
+| [百川](3_1_2_百川使用.md)              |
+| [Claude](3_1_2_Claude使用.md)      |
+| [ollama](3_1_2_Ollama使用.md)      |
 
 未在列表中的模型您可以根据[模型定义](2_2_2_模型定义与使用.md)中的步骤自定义接入任何模型。
 
-同时我们正在添加Claude、Gemini、ollama、Llama、ZhipuAI等常见LLM的接入方式，如果您在工程中使用了这些LLM并创建了属于自己的实例，欢迎您提交pr成为agentUniverse的contributor。
\ No newline at end of file
+同时我们正在添加Gemini、Llama、ZhipuAI等常见LLM的接入方式，如果您在工程中使用了这些LLM并创建了属于自己的实例，欢迎您提交pr成为agentUniverse的contributor。
\ No newline at end of file
diff --git "a/docs/guidebook/zh/3_1_2_Claude\344\275\277\347\224\250.md" "b/docs/guidebook/zh/3_1_2_Claude\344\275\277\347\224\250.md"
new file mode 100644
index 00000000..af62c192
--- /dev/null
+++ "b/docs/guidebook/zh/3_1_2_Claude\344\275\277\347\224\250.md"
@@ -0,0 +1,34 @@
+# Claude 使用
+## 1. 创建相关文件
+创建一个yaml文件，例如 user_claude.yaml
+将以下内容粘贴到您的user_claude.yaml文件当中
+```yaml
+name: 'user_claude_llm'
+description: 'user claude llm with spi'
+model_name: 'claude-3-opus-20240229'
+max_tokens: 4096
+metadata:
+  type: 'LLM'
+  module: 'agentuniverse.llm.default.claude_llm'
+  class: 'ClaudeLLM'
+```
+## 2. 环境设置
+必须配置：ANTHROPIC_API_KEY  
+选配：ANTHROPIC_API_URL
+### 2.1 通过python代码配置
+```python
+import os
+os.environ['ANTHROPIC_API_KEY'] = 'sk-***'
+os.environ['ANTHROPIC_API_URL'] = 'https://xxxxxx'
+```
+### 2.2 通过配置文件配置
+在项目的config目录下的custom_key.toml当中，添加配置：
+```toml
+ANTHROPIC_API_KEY="sk-******"
+ANTHROPIC_API_URL="https://xxxxxx"
+```
+## 3. Claude API KEY 获取
+参考 Claude 官方文档：https://docs.anthropic.com/zh-CN/docs/getting-access-to-claude
+
+## 4. 注意
+在agentuniverse中，我们已经创建了一个name为default_claude_llm的llm,用户在配置ANTHROPIC_API_KEY之后可以直接使用
\ No newline at end of file
diff --git "a/docs/guidebook/zh/3_1_2_Ollama\344\275\277\347\224\250.md" "b/docs/guidebook/zh/3_1_2_Ollama\344\275\277\347\224\250.md"
new file mode 100644
index 00000000..dbf3ed3a
--- /dev/null
+++ "b/docs/guidebook/zh/3_1_2_Ollama\344\275\277\347\224\250.md"
@@ -0,0 +1,32 @@
+# Ollama 使用
+## 1. 创建相关文件
+创建一个yaml文件，例如 user_ollama.yaml
+将以下内容粘贴到您的user_ollama.yaml文件当中
+```yaml
+name: 'user_ollama_llm'
+description: 'user ollama llm with spi'
+model_name: 'qwen2:7b'
+max_tokens: 1000
+max_context_length: 32000
+metadata:
+  type: 'LLM'
+  module: 'agentuniverse.llm.default.default_ollama_llm'
+  class: 'OllamaLLM'
+```
+## 2. 环境设置
+### 2.1 通过python代码配置
+必须配置：OLLAMA_BASE_URL
+```python
+import os
+os.environ['OLLAMA_BASE_URL'] = 'https://xxxxxx'
+```
+### 2.2 通过配置文件配置
+在项目的config目录下的custom_key.toml当中，添加配置：
+```toml
+OLLAMA_BASE_URL="https://xxxxxx"
+```
+
+## 3. Tips
+在agentuniverse中，我们已经创建了一个name为default_ollama_llm的llm,用户在配置OLLAMA_BASE_URL之后可以直接使用。
+使用ollama参考官方地址：https://www.ollama.com/library/qwen2
+
diff --git a/docs/guidebook/zh/3_3_1_Milvus.md b/docs/guidebook/zh/3_3_1_Milvus.md
index 0f97daaa..f898f8c5 100644
--- a/docs/guidebook/zh/3_3_1_Milvus.md
+++ b/docs/guidebook/zh/3_3_1_Milvus.md
@@ -20,7 +20,7 @@ pip install pymilvus
 
 ### 我可以用Milvus做些什么
 
-您可以在[Knowledge组件]()中使用Milvus来存储和查询知识，你可以使用以下方式来创建一个使用Milvus的存储组件:
+您可以在[知识组件](2_2_4_知识.md)中使用Milvus来存储和查询知识，你可以使用以下方式来创建一个使用Milvus的存储组件:
 ```python
 from agentuniverse.agent.action.knowledge.store.milvus_store import MilvusStore
 from agentuniverse.agent.action.knowledge.embedding.openai_embedding import OpenAIEmbedding
@@ -38,4 +38,5 @@ init_params['store'] = MilvusStore(
 )
 knowledge = Knowledge(**init_params)
 ```
-上面的代码会创建一个基于Milvus的Knowledge，关于Knowledge的具体用法您可以参考[Knowledge文档]()，或是参考代码`tests/test_agentuniverse/unit/agent/action/knowledge/test_knowledge_with_milvus.py`。
\ No newline at end of file
+
+上面的代码会创建一个基于Milvus的Knowledge，关于Knowledge的具体用法您可以参考[知识组件](2_2_4_知识.md)，或是参考代码`tests/test_agentuniverse/unit/agent/action/knowledge/test_knowledge_with_milvus.py`。
diff --git a/docs/guidebook/zh/3_3_2_ChromaDB.md b/docs/guidebook/zh/3_3_2_ChromaDB.md
new file mode 100644
index 00000000..8ea84f0f
--- /dev/null
+++ b/docs/guidebook/zh/3_3_2_ChromaDB.md
@@ -0,0 +1,24 @@
+## ChromaDB
+
+agentUniverse中已集成ChromaDB相关依赖，您无需额外安装包即可使用ChromaDB的相关功能。
+如果您想学习ChromaDB相关的底层原理，您可以查阅ChromaDB的[官方网站](https://www.trychroma.com/)。
+
+### 我可以用ChromaDB做些什么
+
+
+您可以在[知识组件](2_2_4_知识.md)中使用ChromaDB来存储和查询知识，你可以使用以下方式来创建一个使用ChromaDB的存储组件:
+```python
+from agentuniverse.agent.action.knowledge.embedding.openai_embedding import OpenAIEmbedding
+from agentuniverse.agent.action.knowledge.knowledge import Knowledge
+from agentuniverse.agent.action.knowledge.store.chroma_store import ChromaStore
+
+
+init_params = dict()
+init_params['name'] = 'test_knowledge'
+init_params['description'] = 'test_knowledge_description'
+init_params['store'] = ChromaStore(collection_name="test_knowledge", embedding_model=OpenAIEmbedding(
+    embedding_model_name='text-embedding-ada-002'))
+knowledge = Knowledge(**init_params)
+```
+
+上面的代码会创建一个基于ChromaDB的Knowledge，关于Knowledge的具体用法您可以参考[知识组件](2_2_4_知识.md)，或是参考代码`tests/test_agentuniverse/unit/agent/action/knowledge/test_knowledge.py`。
\ No newline at end of file
diff --git "a/docs/guidebook/zh/6_2_1_\350\256\250\350\256\272\347\273\204.md" "b/docs/guidebook/zh/6_2_1_\350\256\250\350\256\272\347\273\204.md"
index a3289267..e974458e 100644
--- "a/docs/guidebook/zh/6_2_1_\350\256\250\350\256\272\347\273\204.md"
+++ "b/docs/guidebook/zh/6_2_1_\350\256\250\350\256\272\347\273\204.md"
@@ -38,6 +38,14 @@ def chat(question: str):
 if __name__ == '__main__':
     chat("甜粽子好吃还是咸粽子好吃")
 ```
+### 效果演示
+甜粽子好吃还是咸粽子好吃：
+
+![演示图片](../_picture/sweet_or_salted_zongzi.png)
+
+中医好还是西医好：
+
+![演示图片](../_picture/chinese_or_western_medicine.png)
 
 ## 更多细节
 ### 智能体配置
diff --git "a/docs/guidebook/zh/7_1_1_Python\350\207\252\345\212\250\346\211\247\350\241\214\346\241\210\344\276\213.md" "b/docs/guidebook/zh/7_1_1_Python\350\207\252\345\212\250\346\211\247\350\241\214\346\241\210\344\276\213.md"
new file mode 100644
index 00000000..729c2773
--- /dev/null
+++ "b/docs/guidebook/zh/7_1_1_Python\350\207\252\345\212\250\346\211\247\350\241\214\346\241\210\344\276\213.md"
@@ -0,0 +1,74 @@
+# Python自动执行案例
+## 案例说明
+本案例基于ReactPlanner，搭建了一个简单可以自动生成python代码并执行的案例。
+
+该案例基于千问大模型和`goolge_search`功能，使用前需要您在环境变量中配置`DASHSCOPE_API_KEY`、`SERPER_API_KEY`。
+
+## 快速开始
+### 配置API密钥
+比如在agentUniverse管理私有密钥配置的文件`custom_key.toml`中配置密钥信息（讨论组默认使用qwen作为基座模型，serper作为google search工具）
+```toml
+[KEY_LIST]
+# serper google search key
+SERPER_API_KEY='xxx'
+# openai api key
+DASHSCOPE_API_KEY='xxx'
+```
+
+### 创建Agent
+```yaml
+info:
+  name: 'demo_react_agent'
+  description: 'react agent'
+profile:
+  prompt_version: qwen_react_agent.cn
+  llm_model:
+    name: 'default_qwen_llm'
+    model_name : 'qwen-max'
+    temperature: 0
+action:
+  tool:
+    - 'google_search_tool'
+    - 'python_runner'
+plan:
+  planner:
+    name: 'react_planner'
+metadata:
+  type: 'AGENT'
+  module: 'agentuniverse.agent.default.react_agent.react_agent'
+  class: 'ReActAgent'
+```
+
+这里使用了google_search_tool与python_runner两个工具，相关工具代码链接如下：
+- [google_search_tool](../../../sample_standard_app/app/core/tool/google_search_tool.yaml)
+- [python_runner](../../../sample_standard_app/app/core/tool/python_repl_tool.yaml)
+
+
+### 代码运行
+1. 测试用例运行
+直接使用测试代码运行[test_case](../../../sample_standard_app/app/test/test_react_agent.py)
+2. 接口运行
+配置好相关key之后，启动web服务，使用下面的curl进行测试
+```shell
+curl --location --request POST 'http://localhost:8888/service_run' \
+--header 'Cookie: spanner=fQ47DxJmWYzf8rKDhs69LExySZYZFUiVXt2T4qEYgj0' \
+--header 'Content-Type: application/json' \
+--data-raw '{
+    
+    "service_id": "demo_react_service",
+    "params": {
+        "input": "请帮我生成一段python代码，可以计算三数之和"
+    }
+}'
+```
+
+### 执行结果
+![test_case](../_picture/react_demo_step.png)
+
+图片中，react一共执行了三步：  
+    第一步，模型根据问题给出了一段python代码，并交给python_runner工具执行，但是执行失败了，失败原因是没有使用print打印执行结果。  
+    第二步，模型意识到错误，主动修改了代码，再次使用python_runner工具执行，执行成功。  
+    第三步，模型将执行成功的代码告诉给用户。  
+
+### 注意
+受限于模型能力问题，建议使用qwen-max模型进行测试
\ No newline at end of file
diff --git "a/docs/guidebook/zh/7_1_1_\346\263\225\345\276\213\345\222\250\350\257\242\346\241\210\344\276\213.md" "b/docs/guidebook/zh/7_1_1_\346\263\225\345\276\213\345\222\250\350\257\242\346\241\210\344\276\213.md"
new file mode 100644
index 00000000..c7d8b7c7
--- /dev/null
+++ "b/docs/guidebook/zh/7_1_1_\346\263\225\345\276\213\345\222\250\350\257\242\346\241\210\344\276\213.md"
@@ -0,0 +1,35 @@
+# 法律咨询案例
+## 案例说明
+本案例基于RagPlanner，搭建了一个简单的法律咨询智能体，通过检索民法典和刑法中的相关条例并结合案件背景给出相关的法律建议。
+
+该案例基于千文大模型和`DashScope`的embedding功能，使用前需要您在环境变量中配置`DASHSCOPE_API_KEY`。
+
+## 构成
+### 法律知识库
+法律知识库基于agentUniverse中的[知识组件](2_2_4_知识.md)，通过将法律条款原文embedding后存储至ChromaDB的向量数据库中，构建方便智能体查阅检索的知识库。  
+法律书籍原本：
+- [民法典.pdf](../../../sample_standard_app/app/resources/民法典.pdf)
+- [刑法.pdf](../../../sample_standard_app/app/resources/刑法.pdf)
+
+具体代码可以参考：
+- [民法典知识库](../../../sample_standard_app/app/core/knowledge/civil_law_knowledge.py)
+- [刑法知识库](../../../sample_standard_app/app/core/knowledge/criminal_law_knowledge.py)
+
+为了方便您使用，我们已经将存储有相关信息的数据库文件放在[该目录下](../../../sample_standard_app/DB/)，如果您想从头构建知识库的话，您可以修改代码中的如下部分：
+```python
+# Initialize the knowledge
+# self.insert_knowledge()
+```
+将`self.insert_knowledge()`前的注释去掉，即可重新构建数据库。
+
+### 法律智能体
+该智能体涉及如下两个文件： 
+- [law_rag_agent.py](../../../sample_standard_app/app/core/agent/rag_agent_case/law_rag_agent.py): 定义了智能体的输入和输出
+- [law_rag_agent.yaml](../../../sample_standard_app/app/core/agent/rag_agent_case/law_rag_agent.yaml): 定义了智能体的相关提示词
+
+
+### 演示代码
+[代码链接](../../../sample_standard_app/app/examples/law_chat_bot.py)
+
+## 效果演示
+![演示图片](../_picture/law_agent_demo.png)
\ No newline at end of file
diff --git a/pyproject.toml b/pyproject.toml
index d725b8f9..e29498b8 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
 [tool.poetry]
 name = "agentUniverse"
-version = "0.0.8"
+version = "0.0.9"
 description = "agentUniverse is a framework for developing applications powered by multi-agent base on large language model."
 
 authors = ["AntGroup <jerry.zzw@antgroup.com>"]
@@ -37,6 +37,7 @@ pydantic = "^2.6.4"
 gunicorn = "^22.0.0"
 grpcio = "1.63.0"
 chromadb = "0.4.24"
+opentelemetry-exporter-otlp-proto-grpc = "^1.25.0"
 sphinx = "^7.2.6"
 Jinja2 = "^3.1.4"
 tqdm = "^4.66.3"
@@ -48,6 +49,8 @@ myst-parser = "^2.0.0"
 qianfan = "^0.3.12"
 dashscope = "^1.19.1"
 anthropic = "^0.26.0"
+ollama = '^0.2.1'
+langchain-anthropic = '^0.1.13'
 
 [tool.poetry.extras]
 log_ext = ["aliyun-log-python-sdk"]
diff --git a/sample_standard_app/DB/civil_law.db/373b58cb-6652-4697-8788-5e639678e409/data_level0.bin b/sample_standard_app/DB/civil_law.db/373b58cb-6652-4697-8788-5e639678e409/data_level0.bin
new file mode 100644
index 00000000..ea3192e8
Binary files /dev/null and b/sample_standard_app/DB/civil_law.db/373b58cb-6652-4697-8788-5e639678e409/data_level0.bin differ
diff --git a/sample_standard_app/DB/civil_law.db/373b58cb-6652-4697-8788-5e639678e409/header.bin b/sample_standard_app/DB/civil_law.db/373b58cb-6652-4697-8788-5e639678e409/header.bin
new file mode 100644
index 00000000..3e0932a7
Binary files /dev/null and b/sample_standard_app/DB/civil_law.db/373b58cb-6652-4697-8788-5e639678e409/header.bin differ
diff --git a/sample_standard_app/DB/civil_law.db/373b58cb-6652-4697-8788-5e639678e409/length.bin b/sample_standard_app/DB/civil_law.db/373b58cb-6652-4697-8788-5e639678e409/length.bin
new file mode 100644
index 00000000..1dc89f8e
Binary files /dev/null and b/sample_standard_app/DB/civil_law.db/373b58cb-6652-4697-8788-5e639678e409/length.bin differ
diff --git a/sample_standard_app/DB/civil_law.db/373b58cb-6652-4697-8788-5e639678e409/link_lists.bin b/sample_standard_app/DB/civil_law.db/373b58cb-6652-4697-8788-5e639678e409/link_lists.bin
new file mode 100644
index 00000000..e69de29b
diff --git a/sample_standard_app/DB/civil_law.db/chroma.sqlite3 b/sample_standard_app/DB/civil_law.db/chroma.sqlite3
new file mode 100644
index 00000000..a107ddd5
Binary files /dev/null and b/sample_standard_app/DB/civil_law.db/chroma.sqlite3 differ
diff --git a/sample_standard_app/DB/criminal_law.db/c93232cd-8eec-4ac4-a4a2-e64315265207/data_level0.bin b/sample_standard_app/DB/criminal_law.db/c93232cd-8eec-4ac4-a4a2-e64315265207/data_level0.bin
new file mode 100644
index 00000000..ea3192e8
Binary files /dev/null and b/sample_standard_app/DB/criminal_law.db/c93232cd-8eec-4ac4-a4a2-e64315265207/data_level0.bin differ
diff --git a/sample_standard_app/DB/criminal_law.db/c93232cd-8eec-4ac4-a4a2-e64315265207/header.bin b/sample_standard_app/DB/criminal_law.db/c93232cd-8eec-4ac4-a4a2-e64315265207/header.bin
new file mode 100644
index 00000000..3e0932a7
Binary files /dev/null and b/sample_standard_app/DB/criminal_law.db/c93232cd-8eec-4ac4-a4a2-e64315265207/header.bin differ
diff --git a/sample_standard_app/DB/criminal_law.db/c93232cd-8eec-4ac4-a4a2-e64315265207/length.bin b/sample_standard_app/DB/criminal_law.db/c93232cd-8eec-4ac4-a4a2-e64315265207/length.bin
new file mode 100644
index 00000000..73385e9b
Binary files /dev/null and b/sample_standard_app/DB/criminal_law.db/c93232cd-8eec-4ac4-a4a2-e64315265207/length.bin differ
diff --git a/sample_standard_app/DB/criminal_law.db/c93232cd-8eec-4ac4-a4a2-e64315265207/link_lists.bin b/sample_standard_app/DB/criminal_law.db/c93232cd-8eec-4ac4-a4a2-e64315265207/link_lists.bin
new file mode 100644
index 00000000..e69de29b
diff --git a/sample_standard_app/DB/criminal_law.db/chroma.sqlite3 b/sample_standard_app/DB/criminal_law.db/chroma.sqlite3
new file mode 100644
index 00000000..37142723
Binary files /dev/null and b/sample_standard_app/DB/criminal_law.db/chroma.sqlite3 differ
diff --git a/sample_standard_app/app/bootstrap/server_application.py b/sample_standard_app/app/bootstrap/server_application.py
index 3f59fb94..cb5cb908 100644
--- a/sample_standard_app/app/bootstrap/server_application.py
+++ b/sample_standard_app/app/bootstrap/server_application.py
@@ -5,6 +5,7 @@
 # @Author  : jerry.zzw 
 # @Email   : jerry.zzw@antgroup.com
 # @FileName: server_application.py
+
 from agentuniverse.agent_serve.web.web_booster import start_web_server
 from agentuniverse.base.agentuniverse import AgentUniverse
 
diff --git a/sample_standard_app/app/core/agent/nl2api_agent_case/__init__.py b/sample_standard_app/app/core/agent/nl2api_agent_case/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/sample_standard_app/app/core/agent/nl2api_agent_case/nl2api_agent.yaml b/sample_standard_app/app/core/agent/nl2api_agent_case/nl2api_agent.yaml
new file mode 100644
index 00000000..2bf6c79d
--- /dev/null
+++ b/sample_standard_app/app/core/agent/nl2api_agent_case/nl2api_agent.yaml
@@ -0,0 +1,20 @@
+info:
+  name: 'demo_nl2api_agent'
+  description: 'demo nl2api agent'
+profile:
+  llm_model:
+    name: 'default_qwen_llm'
+action:
+  tool:
+    - 'add'
+    - 'sub'
+    - 'mul'
+    - 'div'
+    - 'google_search_tool'
+plan:
+  planner:
+    name: 'nl2api_planner'
+metadata:
+  type: 'AGENT'
+  module: 'agentuniverse.agent.default.nl2api_agent.nl2api_agent'
+  class: 'Nl2ApiAgent'
\ No newline at end of file
diff --git a/sample_standard_app/app/core/agent/rag_agent_case/demo_rag_agent.yaml b/sample_standard_app/app/core/agent/rag_agent_case/demo_rag_agent.yaml
index 8457d2df..fecdd274 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
@@ -24,8 +24,8 @@ profile:
 
     需要回答的问题是: {input}
   llm_model:
-    name: 'demo_llm'
-    model_name: 'gpt-4o'
+    name: 'default_qwen_llm'
+#    model_name: 'gpt-4o'
 plan:
   planner:
     name: 'rag_planner'
diff --git a/sample_standard_app/app/core/agent/rag_agent_case/law_rag_agent.py b/sample_standard_app/app/core/agent/rag_agent_case/law_rag_agent.py
new file mode 100644
index 00000000..6726f620
--- /dev/null
+++ b/sample_standard_app/app/core/agent/rag_agent_case/law_rag_agent.py
@@ -0,0 +1,24 @@
+# !/usr/bin/env python3
+# -*- coding:utf-8 -*-
+
+# @Time    : 2024/6/12 19:56
+# @Author  : wangchongshi
+# @Email   : wangchongshi.wcs@antgroup.com
+# @FileName: law_rag_agent.py
+from agentuniverse.agent.agent import Agent
+from agentuniverse.agent.input_object import InputObject
+
+
+class LawRagAgent(Agent):
+    def input_keys(self) -> list[str]:
+        return ['input']
+
+    def output_keys(self) -> list[str]:
+        return ['output']
+
+    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/law_rag_agent.yaml b/sample_standard_app/app/core/agent/rag_agent_case/law_rag_agent.yaml
new file mode 100644
index 00000000..bf917fcd
--- /dev/null
+++ b/sample_standard_app/app/core/agent/rag_agent_case/law_rag_agent.yaml
@@ -0,0 +1,33 @@
+info:
+  name: 'law_rag_agent'
+  description: 'law rag agent'
+profile:
+  introduction: 你是一位精通信息分析的ai法律顾问。
+  target: 你的目标是根据给出的事件，以及提供的背景知识做出客观的司法判断。
+  instruction: |
+    你需要遵守的规则是:
+    1. 必须使用中文结合背景信息做出判决，没有在背景知识中的条例不允许引用。
+    2. 结构化答案生成，必要时通过空行提升阅读体验。
+    3. 多考虑背景知识和场景的关联性。
+    4. 多使用“根据民法典第XX条”“根据刑法第XX条”这种句式开头，但要求事件内容确实和对应条目相关，否则不要提及。
+    5. 如果背景信息和内容无关则不要引用，引用条例时不要再强调“根据背景信息”这一点。
+    
+
+    背景信息是:
+    {background}
+
+    事件是: {input}
+  llm_model:
+    name: 'qwen_llm'
+    model_name: 'qwen-max'
+plan:
+  planner:
+    name: 'rag_planner'
+action:
+  knowledge:
+    - 'civil_law_knowledge'
+    - 'criminal_law_knowledge'
+metadata:
+  type: 'AGENT'
+  module: 'sample_standard_app.app.core.agent.rag_agent_case.law_rag_agent'
+  class: 'LawRagAgent'
\ No newline at end of file
diff --git a/sample_standard_app/app/core/agent/react_agent_case/__init__.py b/sample_standard_app/app/core/agent/react_agent_case/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/sample_standard_app/app/core/agent/react_agent_case/demo_react_agent.yaml b/sample_standard_app/app/core/agent/react_agent_case/demo_react_agent.yaml
new file mode 100644
index 00000000..8a38838d
--- /dev/null
+++ b/sample_standard_app/app/core/agent/react_agent_case/demo_react_agent.yaml
@@ -0,0 +1,19 @@
+info:
+  name: 'demo_react_agent'
+  description: 'react agent'
+profile:
+  prompt_version: qwen_react_agent.cn
+  llm_model:
+    name: 'default_qwen_llm'
+    temperature: 0
+action:
+  tool:
+    - 'google_search_tool'
+    - 'python_runner'
+plan:
+  planner:
+    name: 'react_planner'
+metadata:
+  type: 'AGENT'
+  module: 'agentuniverse.agent.default.react_agent.react_agent'
+  class: 'ReActAgent'
\ No newline at end of file
diff --git a/sample_standard_app/app/core/knowledge/civil_law_knowledge.py b/sample_standard_app/app/core/knowledge/civil_law_knowledge.py
new file mode 100644
index 00000000..fa38fac7
--- /dev/null
+++ b/sample_standard_app/app/core/knowledge/civil_law_knowledge.py
@@ -0,0 +1,44 @@
+# !/usr/bin/env python3
+# -*- coding:utf-8 -*-
+
+# @Time    : 2024/3/28 19:28
+# @Author  : wangchongshi
+# @Email   : wangchongshi.wcs@antgroup.com
+# @FileName: demo_knowledge.py
+
+from agentuniverse.agent.action.knowledge.embedding.dashscope_embedding import DashscopeEmbedding
+from agentuniverse.agent.action.knowledge.knowledge import Knowledge
+from agentuniverse.agent.action.knowledge.reader.file.pdf_reader import PdfReader
+from agentuniverse.agent.action.knowledge.store.chroma_store import ChromaStore
+from agentuniverse.agent.action.knowledge.store.document import Document
+from langchain.text_splitter import TokenTextSplitter
+from pathlib import Path
+
+SPLITTER = TokenTextSplitter(chunk_size=600, chunk_overlap=100)
+
+
+class CivilLawKnowledge(Knowledge):
+    """The demo knowledge."""
+
+    def __init__(self, **kwargs):
+        super().__init__(**kwargs)
+        self.store = ChromaStore(
+            collection_name="law_store",
+            persist_path="../../DB/civil_law.db",
+            embedding_model=DashscopeEmbedding(
+                embedding_model_name='text-embedding-v2'
+            ),
+            dimensions=1536)
+        self.reader = PdfReader()
+        # Initialize the knowledge
+        # self.insert_knowledge()
+
+    def insert_knowledge(self, **kwargs) -> None:
+        """
+        Load civil law pdf and save into vector database.
+        """
+        civil_law_docs = self.reader.load_data(Path("../resources/民法典.pdf"))
+        lc_doc_list = SPLITTER.split_documents(Document.as_langchain_list(
+            civil_law_docs
+        ))
+        self.store.insert_documents(Document.from_langchain_list(lc_doc_list))
diff --git a/sample_standard_app/app/core/knowledge/civil_law_knowledge.yaml b/sample_standard_app/app/core/knowledge/civil_law_knowledge.yaml
new file mode 100644
index 00000000..86ddd6b0
--- /dev/null
+++ b/sample_standard_app/app/core/knowledge/civil_law_knowledge.yaml
@@ -0,0 +1,6 @@
+name: 'civil_law_knowledge'
+description: 'civil law knowledge'
+metadata:
+  type: 'KNOWLEDGE'
+  module: 'sample_standard_app.app.core.knowledge.civil_law_knowledge'
+  class: 'CivilLawKnowledge'
\ No newline at end of file
diff --git a/sample_standard_app/app/core/knowledge/criminal_law_knowledge.py b/sample_standard_app/app/core/knowledge/criminal_law_knowledge.py
new file mode 100644
index 00000000..124baa83
--- /dev/null
+++ b/sample_standard_app/app/core/knowledge/criminal_law_knowledge.py
@@ -0,0 +1,62 @@
+# !/usr/bin/env python3
+# -*- coding:utf-8 -*-
+
+# @Time    : 2024/3/28 19:28
+# @Author  : wangchongshi
+# @Email   : wangchongshi.wcs@antgroup.com
+# @FileName: demo_knowledge.py
+
+from agentuniverse.agent.action.knowledge.embedding.dashscope_embedding import DashscopeEmbedding
+from agentuniverse.agent.action.knowledge.knowledge import Knowledge
+from agentuniverse.agent.action.knowledge.reader.file.pdf_reader import PdfReader
+from agentuniverse.agent.action.knowledge.store.chroma_store import ChromaStore
+from agentuniverse.agent.action.knowledge.store.document import Document
+from langchain.text_splitter import TokenTextSplitter
+from pathlib import Path
+
+SPLITTER = TokenTextSplitter(chunk_size=600, chunk_overlap=100)
+
+
+class CriminalLawKnowledge(Knowledge):
+    """The demo knowledge."""
+
+    def __init__(self, **kwargs):
+        """The __init__ method.
+
+        Some parameters, such as name and description,
+        are injected into this class by the demo_knowledge.yaml configuration.
+
+
+        Args:
+            name (str): Name of the knowledge.
+
+            description (str): Description of the knowledge.
+
+            store (Store): Store of the knowledge, store class is used to store knowledge
+            and provide retrieval capabilities, such as ChromaDB store or Redis Store,
+            demo knowledge uses ChromaDB as the knowledge storage.
+
+            reader (Reader): Reader is used to load data,
+            the demo knowledge uses WebPdfReader to load pdf files from web.
+        """
+        super().__init__(**kwargs)
+        self.store = ChromaStore(
+            collection_name="law_store",
+            persist_path="../../DB/criminal_law.db",
+            embedding_model=DashscopeEmbedding(
+                embedding_model_name='text-embedding-v2'
+            ),
+            dimensions=1536)
+        self.reader = PdfReader()
+        # Initialize the knowledge
+        # self.insert_knowledge()
+
+    def insert_knowledge(self, **kwargs) -> None:
+        """
+        Load criminal law pdf and save into vector database.
+        """
+        criminal_law_docs = self.reader.load_data(Path("../resources/刑法.pdf"))
+        lc_doc_list = SPLITTER.split_documents(Document.as_langchain_list(
+            criminal_law_docs
+        ))
+        self.store.insert_documents(Document.from_langchain_list(lc_doc_list))
diff --git a/sample_standard_app/app/core/knowledge/criminal_law_knowledge.yaml b/sample_standard_app/app/core/knowledge/criminal_law_knowledge.yaml
new file mode 100644
index 00000000..5a1b2a8c
--- /dev/null
+++ b/sample_standard_app/app/core/knowledge/criminal_law_knowledge.yaml
@@ -0,0 +1,6 @@
+name: 'criminal_law_knowledge'
+description: 'criminal law knowledge'
+metadata:
+  type: 'KNOWLEDGE'
+  module: 'sample_standard_app.app.core.knowledge.criminal_law_knowledge'
+  class: 'CriminalLawKnowledge'
\ No newline at end of file
diff --git a/sample_standard_app/app/core/llm/qwen_llm.yaml b/sample_standard_app/app/core/llm/qwen_llm.yaml
index 2c2f1b5c..1115947c 100644
--- a/sample_standard_app/app/core/llm/qwen_llm.yaml
+++ b/sample_standard_app/app/core/llm/qwen_llm.yaml
@@ -1,7 +1,7 @@
 name: 'qwen_llm'
 description: 'demo qwen llm with spi'
 model_name: 'qwen-max'
-max_tokens: 1000
+max_tokens: 2000
 metadata:
   type: 'LLM'
   module: 'agentuniverse.llm.default.qwen_openai_style_llm'
diff --git a/sample_standard_app/app/core/prompt/demo_react_prompt.yaml b/sample_standard_app/app/core/prompt/demo_react_prompt.yaml
new file mode 100644
index 00000000..4282da89
--- /dev/null
+++ b/sample_standard_app/app/core/prompt/demo_react_prompt.yaml
@@ -0,0 +1,40 @@
+introduction: 你是一个精通工具使用的AI助手。
+target: 你的目标是根据用户的问题以及给出的背景信息，使用工具回答用户的问题。尤其擅长使用搜索或者使用执行python代码解决问题
+instruction: |
+  你必须优先选择使用提供的工具回答用户提出的问题，若用户没有提供工具可以根据你的通识能力解决问题。
+  你在回答时问题必须使用中文回答。
+  你必须从多个角度、维度分析用户的问题，帮助用户获取最全面的信息，需要根据背景和问题，决定搜索哪些信息可以回答问题。 
+  你必须把大问题拆解为多个小问题，并规划解决步骤。
+  
+  您可以使用以下工具:
+  {tools}
+  
+  你的回答必须严格使用以下格式:
+  
+    Question: 您必须回答的问题
+    Thought: 我这一步应该做什么，为什么要这么做，我现在要使用一个工具, 不允许回答Final Answer
+    Action: 要使用的工具应该，值必须是 [{tool_names}] 之一
+    Action Input: 工具的输入
+    Observation: 工具的执行结果
+    ... (Thought/Action/Action Input/Observation 的过程可以重复 N 次)
+    Thought: 我现在知道所有问题的最终答案了
+    Final Answer: 所有问题的最终答案
+  
+  之前的对话:
+  {chat_history}
+  
+  背景信息是:
+  {background}
+  
+  开始！
+    注意：
+      1.你的回答必须是（Thought/Action/Observation）与（Thought/Final Answer）两种格式之一
+      2.你现在必须根据上一步Observation的结果（成功、失败、报错，信息不完整），判断下一步要执行的动作
+  
+  Question: {input}
+  Thought: {agent_scratchpad}
+  
+
+metadata:
+  type: 'PROMPT'
+  version: 'qwen_react_agent.cn'
diff --git a/sample_standard_app/app/core/prompt/host_agent_cn.yaml b/sample_standard_app/app/core/prompt/host_agent_cn.yaml
index b59d7573..e8d01aac 100644
--- a/sample_standard_app/app/core/prompt/host_agent_cn.yaml
+++ b/sample_standard_app/app/core/prompt/host_agent_cn.yaml
@@ -1,4 +1,4 @@
-introduction: 你是一位精通信息分析的ai问答助手。
+introduction: 你是一位精通信息分析的问答助手。
 target: 人类给你一个问题，你的目标是根据几个讨论组里参与者多轮讨论的结果，给人类一个准确的答案。
 instruction: |
   你需要遵守的规则是:
diff --git a/sample_standard_app/app/core/prompt/host_agent_en.yaml b/sample_standard_app/app/core/prompt/host_agent_en.yaml
index 9c0ec947..16beaaf9 100644
--- a/sample_standard_app/app/core/prompt/host_agent_en.yaml
+++ b/sample_standard_app/app/core/prompt/host_agent_en.yaml
@@ -1,4 +1,4 @@
-introduction: You are an AI Q&A assistant proficient in information analysis.
+introduction: You are a Q&A assistant proficient in information analysis.
 target: Human gives you a question, and your goal is to give human an accurate answer based on the results of multiple rounds of discussion among the participants in the discussion group.
 instruction: |
   The rules you need to follow are:
diff --git a/sample_standard_app/app/core/prompt/participant_agent_cn.yaml b/sample_standard_app/app/core/prompt/participant_agent_cn.yaml
index 63cb3a25..39774c99 100644
--- a/sample_standard_app/app/core/prompt/participant_agent_cn.yaml
+++ b/sample_standard_app/app/core/prompt/participant_agent_cn.yaml
@@ -1,4 +1,4 @@
-introduction: 你是一位精通信息分析的ai问答助手。
+introduction: 你是一位精通信息分析的问答助手。
 target: 人类给你一个问题，你的目标是和另外几个讨论的参与者共同讨论，最后结合多轮的讨论对话结果，给人类一个准确的答案。
 instruction: |
   你需要遵守的规则是:
diff --git a/sample_standard_app/app/core/prompt/participant_agent_en.yaml b/sample_standard_app/app/core/prompt/participant_agent_en.yaml
index b5fe2d88..aa39313e 100644
--- a/sample_standard_app/app/core/prompt/participant_agent_en.yaml
+++ b/sample_standard_app/app/core/prompt/participant_agent_en.yaml
@@ -1,4 +1,4 @@
-introduction: You are an AI Q&A assistant proficient in information analysis.
+introduction: You are a Q&A assistant proficient in information analysis.
 target: Human gives you a question, and your goal is to discuss with several other participants in the discussion, and finally, combined with the results of many rounds of discussion, to give human an accurate answer.
 instruction: |
   The rules you need to follow are:
diff --git a/sample_standard_app/app/core/service/demo_react_service.yaml b/sample_standard_app/app/core/service/demo_react_service.yaml
new file mode 100644
index 00000000..a8718c13
--- /dev/null
+++ b/sample_standard_app/app/core/service/demo_react_service.yaml
@@ -0,0 +1,5 @@
+name: 'demo_react_service'
+description: 'demo react service of demo agent'
+agent: 'demo_react_agent'
+metadata:
+  type: 'SERVICE'
\ No newline at end of file
diff --git a/sample_standard_app/app/core/service/law_service.yaml b/sample_standard_app/app/core/service/law_service.yaml
new file mode 100644
index 00000000..aaf6fe9c
--- /dev/null
+++ b/sample_standard_app/app/core/service/law_service.yaml
@@ -0,0 +1,5 @@
+name: 'law_service'
+description: 'law service of law agent'
+agent: 'law_rag_agent'
+metadata:
+  type: 'SERVICE'
\ No newline at end of file
diff --git a/sample_standard_app/app/core/tool/add_simple_tool.yaml b/sample_standard_app/app/core/tool/add_simple_tool.yaml
new file mode 100644
index 00000000..d5dda037
--- /dev/null
+++ b/sample_standard_app/app/core/tool/add_simple_tool.yaml
@@ -0,0 +1,8 @@
+name: 'add'
+description: 'Adding two float number, input_params with 2 num spilt with comma, return result. For example, input_params = 1, 2 , the result = 3'
+tool_type: 'api'
+input_keys: ['input']
+metadata:
+  type: 'TOOL'
+  module: 'sample_standard_app.app.core.tool.simple_math_tool'
+  class: 'AddTool'
\ No newline at end of file
diff --git a/sample_standard_app/app/core/tool/div_simple_tool.yaml b/sample_standard_app/app/core/tool/div_simple_tool.yaml
new file mode 100644
index 00000000..eea3425d
--- /dev/null
+++ b/sample_standard_app/app/core/tool/div_simple_tool.yaml
@@ -0,0 +1,8 @@
+name: 'div'
+description: 'Dividing two float number, input_params with 2 num spilt with comma, return result. For example, input_params = 6, 3 , the result = 2'
+tool_type: 'api'
+input_keys: ['input']
+metadata:
+  type: 'TOOL'
+  module: 'sample_standard_app.app.core.tool.simple_math_tool'
+  class: 'MultiplyTool'
\ No newline at end of file
diff --git a/sample_standard_app/app/core/tool/google_search_tool.py b/sample_standard_app/app/core/tool/google_search_tool.py
index 50b14d7e..22da460a 100644
--- a/sample_standard_app/app/core/tool/google_search_tool.py
+++ b/sample_standard_app/app/core/tool/google_search_tool.py
@@ -9,6 +9,7 @@
 from pydantic import Field
 from langchain_community.utilities.google_serper import GoogleSerperAPIWrapper
 from agentuniverse.agent.action.tool.tool import Tool, ToolInput
+from agentuniverse.base.config.component_configer.configers.tool_configer import ToolConfiger
 from agentuniverse.base.util.env_util import get_from_env
 
 from sample_standard_app.app.core.tool.mock_search_tool import MockSearchTool
@@ -26,9 +27,9 @@ class GoogleSearchTool(Tool):
     serper_api_key: Optional[str] = Field(default_factory=lambda: get_from_env("SERPER_API_KEY"))
 
     def execute(self, tool_input: ToolInput):
+        input = tool_input.get_data("input")
         if self.serper_api_key is None:
-            return MockSearchTool().execute(tool_input)
-        query = tool_input.get_data("input")
+            return MockSearchTool().execute(tool_input=tool_input)
         # get top10 results from Google search.
         search = GoogleSerperAPIWrapper(serper_api_key=self.serper_api_key, k=10, gl="us", hl="en", type="search")
-        return search.run(query=query)
+        return search.run(query=input)
\ No newline at end of file
diff --git a/sample_standard_app/app/core/tool/google_search_tool.yaml b/sample_standard_app/app/core/tool/google_search_tool.yaml
index 93ca5659..c8ed4af3 100644
--- a/sample_standard_app/app/core/tool/google_search_tool.yaml
+++ b/sample_standard_app/app/core/tool/google_search_tool.yaml
@@ -1,5 +1,9 @@
 name: 'google_search_tool'
-description: 'demo google search tool'
+description: |
+  该工具可以用来进行谷歌搜索，工具的输入是你想搜索的内容。
+  工具输入示例：
+    示例1: 你想要搜索上海的天气时，工具的输入应该是：上海今天的天气
+    示例2: 你想要搜索日本的天气时，工具的输入应该是：日本的天气
 tool_type: 'api'
 input_keys: ['input']
 metadata:
diff --git a/sample_standard_app/app/core/tool/mock_search_tool.py b/sample_standard_app/app/core/tool/mock_search_tool.py
index ebd78516..f0b85660 100644
--- a/sample_standard_app/app/core/tool/mock_search_tool.py
+++ b/sample_standard_app/app/core/tool/mock_search_tool.py
@@ -41,5 +41,6 @@ class MockSearchTool(Tool):
     """
 
     def execute(self, tool_input: ToolInput):
+        input = tool_input.get_data("input")
         """Demonstrates the execute method of the Tool class."""
         return MOCK_SEARCH_RESULT
diff --git a/sample_standard_app/app/core/tool/mul_simple_tool.yaml b/sample_standard_app/app/core/tool/mul_simple_tool.yaml
new file mode 100644
index 00000000..ca5e95c7
--- /dev/null
+++ b/sample_standard_app/app/core/tool/mul_simple_tool.yaml
@@ -0,0 +1,8 @@
+name: 'mul'
+description: 'Multiplying two float number, input_params with 2 num spilt with comma, return result. For example, a = 2, 1 , the result = 2'
+tool_type: 'api'
+input_keys: ['input']
+metadata:
+  type: 'TOOL'
+  module: 'sample_standard_app.app.core.tool.simple_math_tool'
+  class: 'MultiplyTool'
\ No newline at end of file
diff --git a/sample_standard_app/app/core/tool/python_repl.py b/sample_standard_app/app/core/tool/python_repl.py
new file mode 100644
index 00000000..04af11c1
--- /dev/null
+++ b/sample_standard_app/app/core/tool/python_repl.py
@@ -0,0 +1,41 @@
+# !/usr/bin/env python3
+# -*- coding:utf-8 -*-
+
+# @Time    : 2024/6/12 16:36
+# @Author  : weizjajj 
+# @Email   : weizhongjie.wzj@antgroup.com
+# @FileName: python_repl.py
+
+import re
+
+from langchain_community.utilities import PythonREPL
+from pydantic import Field
+from agentuniverse.agent.action.tool.tool import Tool, ToolInput
+
+
+class PythonREPLTool(Tool):
+    """The mock search tool.
+
+    In this tool, we mocked the search engine's answers to search for information about BYD and Warren Buffett.
+
+    Note:
+        The tool is only suitable for users searching for Buffett or BYD related queries.
+        We recommend that you configure your `SERPER_API_KEY` and use google_search_tool to get information.
+    """
+    client: PythonREPL = Field(default_factory=lambda: PythonREPL())
+
+    def execute(self, tool_input: ToolInput):
+        input = tool_input.get_data("input")
+        """Demonstrates the execute method of the Tool class."""
+        pattern = re.compile(r"```python(.*?)``", re.DOTALL)
+        matches = pattern.findall(input)
+        if len(matches) == 0:
+            pattern = re.compile(r"```py(.*?)``", re.DOTALL)
+            matches = pattern.findall(input)
+        if len(matches) == 0:
+            return self.client.run(input)
+        res = self.client.run(matches[0])
+        if res == "" or res is None:
+            return "ERROR: 你的python代码中没有使用print输出任何内容，请参考工具示例"
+        else:
+            return res
diff --git a/sample_standard_app/app/core/tool/python_repl_tool.yaml b/sample_standard_app/app/core/tool/python_repl_tool.yaml
new file mode 100644
index 00000000..5ec69b46
--- /dev/null
+++ b/sample_standard_app/app/core/tool/python_repl_tool.yaml
@@ -0,0 +1,19 @@
+name: 'python_runner'
+description: '使用该工具可以执行python代码，可以在pycharm中直接运行的代码.工具的输入必须时一段有效的python代码. 如何你想要查看工具的执行结果, 必须在python代码中使用print(...)打印你想查看的内容。
+    工具输入示例：
+      你想要计算1+3等于多少时，工具的输入应该是：
+        ```py 
+        print(1+3)
+        ```
+      你想要获取百度页面的信息时，工具的输入应该是: 
+        ```py 
+        import requests
+        resp=requests.get("https://www.baidu.com")
+        print(resp.content)
+        ```'
+tool_type: 'api'
+input_keys: ['input']
+metadata:
+  type: 'TOOL'
+  module: 'sample_standard_app.app.core.tool.python_repl'
+  class: 'PythonREPLTool'
\ No newline at end of file
diff --git a/sample_standard_app/app/core/tool/search_api_baidu_tool.yaml b/sample_standard_app/app/core/tool/search_api_baidu_tool.yaml
new file mode 100644
index 00000000..ed1c4e84
--- /dev/null
+++ b/sample_standard_app/app/core/tool/search_api_baidu_tool.yaml
@@ -0,0 +1,12 @@
+name: 'search_api_baidu_tool'
+description: '百度(必应)搜索工具，输入为一个要搜索内容的字符串，例如：input=黄金价格是多少'
+tool_type: 'api'
+input_keys: ['input']
+engine: 'baidu'
+search_type: 'json'
+search_params:
+  num: 10
+metadata:
+  type: 'TOOL'
+  module: 'sample_standard_app.app.core.tool.search_api_tool'
+  class: 'SearchAPITool'
\ No newline at end of file
diff --git a/sample_standard_app/app/core/tool/search_api_bing_tool.yaml b/sample_standard_app/app/core/tool/search_api_bing_tool.yaml
new file mode 100644
index 00000000..f4e8d08f
--- /dev/null
+++ b/sample_standard_app/app/core/tool/search_api_bing_tool.yaml
@@ -0,0 +1,12 @@
+name: 'search_api_bing_tool'
+description: 'Bing(必应)搜索工具，输入为一个要搜索内容的字符串，例如：input=黄金价格是多少'
+tool_type: 'api'
+input_keys: ['input']
+engine: 'bing'
+search_type: 'common'
+search_params:
+  num: 10
+metadata:
+  type: 'TOOL'
+  module: 'sample_standard_app.app.core.tool.search_api_tool'
+  class: 'SearchAPITool'
\ No newline at end of file
diff --git a/sample_standard_app/app/core/tool/search_api_tool.py b/sample_standard_app/app/core/tool/search_api_tool.py
new file mode 100644
index 00000000..20032ca1
--- /dev/null
+++ b/sample_standard_app/app/core/tool/search_api_tool.py
@@ -0,0 +1,68 @@
+# !/usr/bin/env python3
+# -*- coding:utf-8 -*-
+import os
+# @Time    : 2024/6/12 09:44
+# @Author  : weizjajj 
+# @Email   : weizhongjie.wzj@antgroup.com
+# @FileName: search_api_tool.py
+
+
+from typing import Optional
+
+from langchain_community.utilities import SearchApiAPIWrapper
+from pydantic import Field
+
+from agentuniverse.agent.action.tool.tool import Tool, ToolInput
+from agentuniverse.base.config.component_configer.configers.tool_configer import ToolConfiger
+from agentuniverse.base.util.env_util import get_from_env
+
+
+class SearchAPITool(Tool):
+    """
+    The demo search tool.
+
+    Implement the execute method of demo google search tool, using the `SearchApiAPIWrapper` to implement a simple search.
+
+    Note:
+        You need to sign up for a free account at https://www.searchapi.io/ and get the SEARCHAPI_API_KEY api key (100 free queries).
+
+    Args:
+        search_api_key: Optional[str] = Field(default_factory=lambda: get_from_env("SEARCHAPI_API_KEY")),
+        engine: str = "google" engine type you want to use
+        search_params: dict = {} engine search parameters
+        search_type: str = "common" result type you want to get ,common string or json
+    """
+
+    search_api_key: Optional[str] = Field(default_factory=lambda: get_from_env("SEARCHAPI_API_KEY"))
+    engine: str = "google"
+    search_params: dict = {}
+    search_api_wrapper: Optional[SearchApiAPIWrapper] = None
+    search_type: str = "common"
+
+    def _load_api_wapper(self):
+        if not self.search_api_key:
+            raise ValueError("Please set the SEARCHAPI_API_KEY environment variable.")
+        if not self.search_api_wrapper:
+            self.search_api_wrapper = SearchApiAPIWrapper(searchapi_api_key=self.search_api_key, engine=self.engine)
+        return self.search_api_wrapper
+
+    def execute(self, tool_input: ToolInput):
+        self._load_api_wapper()
+        search_params = {}
+        for k, v in self.search_params.items():
+            if k in tool_input.to_dict():
+                search_params[k] = tool_input.get_data(k)
+                continue
+            search_params[k] = v
+        input = tool_input.get_data("input")
+        if self.search_type == "json":
+            return self.search_api_wrapper.results(query=input, **search_params)
+        return self.search_api_wrapper.run(query=input, **search_params)
+
+    def initialize_by_component_configer(self, component_configer: ToolConfiger) -> 'Tool':
+        """Initialize the tool by the component configer."""
+        super().initialize_by_component_configer(component_configer)
+        self.engine = component_configer.configer.value.get('engine', 'google')
+        self.search_params = component_configer.configer.value.get('search_params', {})
+        self.search_type = component_configer.configer.value.get('search_type', 'common')
+        return self
diff --git a/sample_standard_app/app/core/tool/simple_math_tool.py b/sample_standard_app/app/core/tool/simple_math_tool.py
new file mode 100644
index 00000000..bca1e0e2
--- /dev/null
+++ b/sample_standard_app/app/core/tool/simple_math_tool.py
@@ -0,0 +1,43 @@
+# !/usr/bin/env python3
+# -*- coding:utf-8 -*-
+from langchain_core.utils.json import parse_json_markdown
+
+# @Time    : 2024/6/11 09:49
+# @Author  : weizjajj 
+# @Email   : weizhongjie.wzj@antgroup.com
+# @FileName: simple_math_tool.py
+
+
+from agentuniverse.agent.action.tool.tool import Tool, ToolInput
+
+
+class AddTool(Tool):
+    def execute(self, tool_input: ToolInput):
+        input_params = tool_input.get_data('input')
+        a, b = input_params.split(',')
+        result = float(a) + float(b)
+        return result
+
+
+class SubtractTool(Tool):
+    def execute(self,  tool_input: ToolInput):
+        input_params = tool_input.get_data('input')
+        a, b = input_params.split(',')
+        result = float(a) - float(b)
+        return result
+
+
+class MultiplyTool(Tool):
+    def execute(self,  tool_input: ToolInput):
+        input_params = tool_input.get_data('input')
+        a, b = input_params.split(',')
+        result = float(a) * float(b)
+        return result
+
+
+class DivideTool(Tool):
+    def execute(self,  tool_input: ToolInput):
+        input_params = tool_input.get_data('input')
+        a, b = input_params.split(',')
+        result = float(a) / float(b)
+        return result
diff --git a/sample_standard_app/app/core/tool/sub_simple_tool.yaml b/sample_standard_app/app/core/tool/sub_simple_tool.yaml
new file mode 100644
index 00000000..2a2e6706
--- /dev/null
+++ b/sample_standard_app/app/core/tool/sub_simple_tool.yaml
@@ -0,0 +1,8 @@
+name: 'sub'
+description: 'Subtracting two float number, input_params with 2 num spilt with comma, return result. For example, input_params = 2, 1 , the result = 1'
+tool_type: 'api'
+input_keys: ['input']
+metadata:
+  type: 'TOOL'
+  module: 'sample_standard_app.app.core.tool.simple_math_tool'
+  class: 'SubtractTool'
\ No newline at end of file
diff --git a/sample_standard_app/app/examples/law_chat_bot.py b/sample_standard_app/app/examples/law_chat_bot.py
new file mode 100644
index 00000000..0d8e9ba0
--- /dev/null
+++ b/sample_standard_app/app/examples/law_chat_bot.py
@@ -0,0 +1,39 @@
+# !/usr/bin/env python3
+# -*- coding:utf-8 -*-
+
+# @Time    : 2024/5/8 11:44
+# @Author  : wangchongshi
+# @Email   : wangchongshi.wcs@antgroup.com
+# @FileName: law_chat_bot.py
+from agentuniverse.agent.output_object import OutputObject
+from agentuniverse.agent.agent import Agent
+from agentuniverse.agent.agent_manager import AgentManager
+from agentuniverse.base.agentuniverse import AgentUniverse
+
+AgentUniverse().start(config_path='../../config/config.toml')
+
+
+def chat(question: str):
+    """ Rag agent example.
+
+    The rag agent in agentUniverse becomes a chatbot and can ask questions to get the answer.
+    """
+
+    instance: Agent = AgentManager().get_instance_obj('law_rag_agent')
+    output_object: OutputObject = instance.run(input=question)
+
+    question = f"\nYour event is :\n"
+    question += output_object.get_data('input')
+    print(question)
+
+    background_info = f"\nRetrieved background is :\n"
+    background_info += output_object.get_data('background').replace("\n","")
+    print(background_info)
+
+    res_info = f"\nRag chat bot execution result is :\n"
+    res_info += output_object.get_data('output')
+    print(res_info)
+
+
+if __name__ == '__main__':
+    chat("张三在景区拍摄景区风景，李四闯入了镜头并被拍下。李四能否起诉张三侵犯肖像权，能否要求删除照片")
diff --git "a/sample_standard_app/app/resources/\345\210\221\346\263\225.pdf" "b/sample_standard_app/app/resources/\345\210\221\346\263\225.pdf"
new file mode 100644
index 00000000..5ec96398
Binary files /dev/null and "b/sample_standard_app/app/resources/\345\210\221\346\263\225.pdf" differ
diff --git "a/sample_standard_app/app/resources/\346\260\221\346\263\225\345\205\270.pdf" "b/sample_standard_app/app/resources/\346\260\221\346\263\225\345\205\270.pdf"
new file mode 100644
index 00000000..caa80d99
Binary files /dev/null and "b/sample_standard_app/app/resources/\346\260\221\346\263\225\345\205\270.pdf" differ


Test patch:
diff --git a/sample_standard_app/app/test/test_nl2api_agent.py b/sample_standard_app/app/test/test_nl2api_agent.py
new file mode 100644
index 00000000..6ab794c8
--- /dev/null
+++ b/sample_standard_app/app/test/test_nl2api_agent.py
@@ -0,0 +1,29 @@
+# !/usr/bin/env python3
+# -*- coding:utf-8 -*-
+
+# @Time    : 2024/6/4 21:27
+# @Author  : wangchongshi
+# @Email   : wangchongshi.wcs@antgroup.com
+# @FileName: test_react_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 ReActAgentTest(unittest.TestCase):
+
+    def setUp(self) -> None:
+        AgentUniverse().start(config_path='../../config/config.toml')
+
+    def test_react_agent(self):
+        """Test demo reAct agent."""
+        instance: Agent = AgentManager().get_instance_obj('demo_nl2api_agent')
+        output_object: OutputObject = instance.run(input='1+3/2+10-4*3等于多少')
+        print(output_object.to_dict())
+
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/sample_standard_app/app/test/test_react_agent.py b/sample_standard_app/app/test/test_react_agent.py
new file mode 100644
index 00000000..77534dbd
--- /dev/null
+++ b/sample_standard_app/app/test/test_react_agent.py
@@ -0,0 +1,28 @@
+# !/usr/bin/env python3
+# -*- coding:utf-8 -*-
+
+# @Time    : 2024/6/4 21:27
+# @Author  : wangchongshi
+# @Email   : wangchongshi.wcs@antgroup.com
+# @FileName: test_react_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 ReActAgentTest(unittest.TestCase):
+
+    def setUp(self) -> None:
+        AgentUniverse().start(config_path='../../config/config.toml')
+
+    def test_react_agent(self):
+        """Test demo reAct agent."""
+        instance: Agent = AgentManager().get_instance_obj('demo_react_agent')
+        output_object: OutputObject = instance.run(input='请给出一段python代码，可以计算三数之和，给出之前必须验证代码是否可以运行，最少验证三次')
+
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/sample_standard_app/app/test/test_search_tool.py b/sample_standard_app/app/test/test_search_tool.py
new file mode 100644
index 00000000..f442fad5
--- /dev/null
+++ b/sample_standard_app/app/test/test_search_tool.py
@@ -0,0 +1,23 @@
+import os
+import unittest
+
+from agentuniverse.agent.action.tool.tool_manager import ToolManager
+from agentuniverse.base.agentuniverse import AgentUniverse
+
+
+class SearchToolTest(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."""
+        res = ToolManager().get_instance_obj("baidu_search_tool").run(input="今日黄金价格")
+        print(res)
+
+
+if __name__ == '__main__':
+    unittest.main()