Repository: antgroup/agentUniverse (language: python)

Issue:
Dev remove claude



Discussion / hints:

Fix patch:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 3d8ab500..20210ccc 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -24,6 +24,15 @@ Note - Additional remarks regarding the version.
 ***************************************************
 
 # Version Update History
+## [0.0.7] - 2024-05-29
+### Added
+- LLM component supports multimodal parameter invocation.
+- Added LLM integration methods for Qwen, WenXin, Kimi, Baichuan, etc.
+
+### Note
+- Added a multimodal example agent, see the invocation details in `sample_standard_app.app.test.test_multimodal_agent.MultimodalAgentTest`.
+- Some code optimizations and documentation updates.
+
 ## [0.0.6] - 2024-05-15
 ### Added
 - Support for the GPT-4o model, with updates to related examples.
diff --git a/CHANGELOG_zh.md b/CHANGELOG_zh.md
index 8d0998a1..580c0772 100644
--- a/CHANGELOG_zh.md
+++ b/CHANGELOG_zh.md
@@ -24,6 +24,14 @@ Note - 对于版本的额外说明。
 ***************************************************
 
 # 版本更新记录
+## [0.0.7] - 2024-05-29
+### Added
+- LLM组件支持多模态参数调用
+- 新增通义千问、文心一言、Kimi、百川等常用LLM接入方式
+
+### Note 
+- 添加多模态样例agent调用详情见`sample_standard_app.app.test.test_multimodal_agent.MultimodalAgentTest`
+- 部分代码优化与文档更新
 
 ## [0.0.6] - 2024-05-15
 ### Added
diff --git a/README.md b/README.md
index 9b31fcd5..00549a62 100644
--- a/README.md
+++ b/README.md
@@ -5,7 +5,7 @@ Language version: [English](./README.md) | [中文](./README_zh.md)
 ![](https://img.shields.io/badge/framework-agentUniverse-pink)
 ![](https://img.shields.io/badge/python-3.10%2B-blue?logo=Python)
 [![](https://img.shields.io/badge/%20license-Apache--2.0-yellow)](LICENSE)
-[![Static Badge](https://img.shields.io/badge/pypi-v0.0.6-blue?logo=pypi)](https://pypi.org/project/agentUniverse/)
+[![Static Badge](https://img.shields.io/badge/pypi-v0.0.7-blue?logo=pypi)](https://pypi.org/project/agentUniverse/)
 
 ![](docs/guidebook/_picture/logo_bar.jpg)
 ****************************************
diff --git a/README_zh.md b/README_zh.md
index 84c22ab5..26534b65 100644
--- a/README_zh.md
+++ b/README_zh.md
@@ -5,7 +5,7 @@
 ![](https://img.shields.io/badge/framework-agentUniverse-pink)
 ![](https://img.shields.io/badge/python-3.10%2B-blue?logo=Python)
 [![](https://img.shields.io/badge/%20license-Apache--2.0-yellow)](LICENSE)
-[![Static Badge](https://img.shields.io/badge/pypi-v0.0.6-blue?logo=pypi)](https://pypi.org/project/agentUniverse/)
+[![Static Badge](https://img.shields.io/badge/pypi-v0.0.7-blue?logo=pypi)](https://pypi.org/project/agentUniverse/)
 
 ![](docs/guidebook/_picture/logo_bar.jpg)
 ****************************************
diff --git a/agentuniverse/agent/action/knowledge/embedding/embedding.py b/agentuniverse/agent/action/knowledge/embedding/embedding.py
index d9d71d50..6c6980d5 100644
--- a/agentuniverse/agent/action/knowledge/embedding/embedding.py
+++ b/agentuniverse/agent/action/knowledge/embedding/embedding.py
@@ -30,5 +30,5 @@ async def async_get_embeddings(self, texts: List[str]) -> List[List[float]]:
         """Asynchronously get embeddings."""
 
     def as_langchain(self) -> LCEmbeddings:
-        """Convert the AgentUniverse(AU) embedding class to the langchain embedding class."""
+        """Convert the agentUniverse(aU) embedding class to the langchain embedding class."""
         pass
diff --git a/agentuniverse/agent/action/knowledge/embedding/openai_embedding.py b/agentuniverse/agent/action/knowledge/embedding/openai_embedding.py
index fa9bba8c..7fa660cc 100644
--- a/agentuniverse/agent/action/knowledge/embedding/openai_embedding.py
+++ b/agentuniverse/agent/action/knowledge/embedding/openai_embedding.py
@@ -91,6 +91,6 @@ async def async_get_embeddings(self, texts: List[str]) -> List[List[float]]:
             raise ValueError(e.message)
 
     def as_langchain(self) -> OpenAIEmbeddings:
-        """Convert the AgentUniverse(AU) openai embedding class to the langchain openai embedding class."""
+        """Convert the agentUniverse(aU) openai embedding class to the langchain openai embedding class."""
         return OpenAIEmbeddings(openai_api_key=self.openai_api_key,
                                 client=self.client.embeddings, async_client=self.async_client.embeddings)
diff --git a/agentuniverse/agent/action/knowledge/reader/file/file_reader.py b/agentuniverse/agent/action/knowledge/reader/file/file_reader.py
index 3c950201..7c156fb6 100644
--- a/agentuniverse/agent/action/knowledge/reader/file/file_reader.py
+++ b/agentuniverse/agent/action/knowledge/reader/file/file_reader.py
@@ -22,7 +22,7 @@
 
 
 class FileReader(Reader):
-    """The AgentUniverse(AU) file reader class.
+    """The agentUniverse(aU) file reader class.
 
     FileReader is used to load data from files based on the provided file paths.
 
diff --git a/agentuniverse/agent/action/knowledge/reader/file/web_pdf_reader.py b/agentuniverse/agent/action/knowledge/reader/file/web_pdf_reader.py
index efd551cb..48219203 100644
--- a/agentuniverse/agent/action/knowledge/reader/file/web_pdf_reader.py
+++ b/agentuniverse/agent/action/knowledge/reader/file/web_pdf_reader.py
@@ -14,7 +14,7 @@
 
 
 class WebPdfReader(Reader):
-    """The AgentUniverse(AU) web pdf reader.
+    """The agentUniverse(aU) web pdf reader.
 
     The pdf file will be downloaded and then parsed by `pdfminer.six`.
     """
diff --git a/agentuniverse/agent/action/knowledge/store/chroma_store.py b/agentuniverse/agent/action/knowledge/store/chroma_store.py
index 7da8f8ad..dcb67a6a 100644
--- a/agentuniverse/agent/action/knowledge/store/chroma_store.py
+++ b/agentuniverse/agent/action/knowledge/store/chroma_store.py
@@ -73,7 +73,7 @@ def query(self, query: Query, **kwargs) -> List[Document]:
                 n_results=query.similarity_top_k,
                 query_texts=[query.query_str]
             )
-        # convert to the AgentUniverse(AU) document format
+        # convert to the agentUniverse(aU) document format
         return self.to_documents(query_result)
 
     def insert_documents(self, documents: List[Document], **kwargs: Any):
@@ -127,7 +127,7 @@ def update_document(self, documents: List[Document], **kwargs):
 
     @staticmethod
     def to_documents(query_result: QueryResult) -> List[Document]:
-        """Convert the query results of ChromaDB to the AgentUniverse(AU) document format."""
+        """Convert the query results of ChromaDB to the agentUniverse(aU) document format."""
 
         if query_result is None:
             return []
diff --git a/agentuniverse/agent/action/knowledge/store/document.py b/agentuniverse/agent/action/knowledge/store/document.py
index 3f999b54..5b7d6fd9 100644
--- a/agentuniverse/agent/action/knowledge/store/document.py
+++ b/agentuniverse/agent/action/knowledge/store/document.py
@@ -40,7 +40,7 @@ def as_langchain(self) -> LCDocument:
 
     @staticmethod
     def as_langchain_list(document_list) -> List[LCDocument]:
-        """Convert AgentUniverse(AU) document list to langchain document list """
+        """Convert agentUniverse(aU) document list to langchain document list """
         langchain_document_list = []
         if document_list is None:
             return langchain_document_list
@@ -50,7 +50,7 @@ def as_langchain_list(document_list) -> List[LCDocument]:
 
     @staticmethod
     def from_langchain_list(lc_document_list: List[LCDocument]):
-        """Convert langchain document list to AgentUniverse(AU) document list """
+        """Convert langchain document list to agentUniverse(aU) document list """
         document_list = []
         if lc_document_list is None:
             return document_list
diff --git a/agentuniverse/agent/action/tool/tool.py b/agentuniverse/agent/action/tool/tool.py
index bb53cc49..2190592b 100644
--- a/agentuniverse/agent/action/tool/tool.py
+++ b/agentuniverse/agent/action/tool/tool.py
@@ -78,7 +78,7 @@ def execute(self, tool_input: ToolInput):
         raise NotImplementedError
 
     def as_langchain(self) -> LangchainTool:
-        """Convert the AgentUniverse(AU) tool class to the langchain tool class."""
+        """Convert the agentUniverse(aU) tool class to the langchain tool class."""
         return LangchainTool(name=self.name,
                              func=self.run,
                              description=self.description)
diff --git a/agentuniverse/agent/default/rag_agent/rag_agent.yaml b/agentuniverse/agent/default/rag_agent/rag_agent.yaml
index c7e5a902..cc1b7948 100644
--- a/agentuniverse/agent/default/rag_agent/rag_agent.yaml
+++ b/agentuniverse/agent/default/rag_agent/rag_agent.yaml
@@ -4,7 +4,7 @@ info:
 profile:
   llm_model:
     name: 'default_openai_llm'
-    model_name: 'gpt-4'
+    model_name: 'gpt-4o'
 plan:
   planner:
     name: 'rag_planner'
diff --git a/agentuniverse/agent/memory/chat_memory.py b/agentuniverse/agent/memory/chat_memory.py
index 568e6507..4e29d158 100644
--- a/agentuniverse/agent/memory/chat_memory.py
+++ b/agentuniverse/agent/memory/chat_memory.py
@@ -37,7 +37,7 @@ class ChatMemory(Memory):
     prompt_version: Optional[str] = None
 
     def as_langchain(self) -> BaseChatMemory:
-        """Convert the AgentUniverse(AU) chat memory class to the langchain chat memory class."""
+        """Convert the agentUniverse(aU) chat memory class to the langchain chat memory class."""
         if self.llm is None:
             raise ValueError("Must set `llm` when using langchain memory.")
         if self.type is None or self.type == MemoryTypeEnum.SHORT_TERM:
@@ -70,10 +70,10 @@ def initialize_by_component_configer(self, component_configer: MemoryConfiger) -
             ChatMemory: the ChatMemory object
         """
         super().initialize_by_component_configer(component_configer)
-        if component_configer.input_key:
+        if hasattr(component_configer, 'input_key') and component_configer.input_key:
             self.input_key = component_configer.input_key
-        if component_configer.output_key:
+        if hasattr(component_configer, 'output_key') and component_configer.output_key:
             self.output_key = component_configer.output_key
-        if component_configer.prompt_version:
+        if hasattr(component_configer, 'prompt_version') and component_configer.prompt_version:
             self.prompt_version = component_configer.prompt_version
         return self
diff --git a/agentuniverse/agent/memory/memory.py b/agentuniverse/agent/memory/memory.py
index 1aa6b040..a76389d5 100644
--- a/agentuniverse/agent/memory/memory.py
+++ b/agentuniverse/agent/memory/memory.py
@@ -37,7 +37,7 @@ def __init__(self, **kwargs):
         super().__init__(component_type=ComponentEnum.MEMORY, **kwargs)
 
     def as_langchain(self) -> BaseMemory:
-        """Convert the AgentUniverse(AU) memory class to the langchain memory class."""
+        """Convert the agentUniverse(aU) memory class to the langchain memory class."""
         pass
 
     def set_by_agent_model(self, **kwargs) -> None:
diff --git a/agentuniverse/agent/memory/message.py b/agentuniverse/agent/memory/message.py
index 8e639c9f..d2595b0d 100644
--- a/agentuniverse/agent/memory/message.py
+++ b/agentuniverse/agent/memory/message.py
@@ -27,7 +27,7 @@ class Message(BaseModel):
     content: Union[str, List[Union[str, Dict]]] = None
 
     def as_langchain(self):
-        """Convert the AgentUniverse(AU) message class to the langchain message class."""
+        """Convert the agentUniverse(aU) message class to the langchain message class."""
         if self.type == ChatMessageEnum.SYSTEM.value:
             return SystemMessagePromptTemplate.from_template(self.content)
         elif self.type == ChatMessageEnum.HUMAN.value:
@@ -42,7 +42,7 @@ def as_langchain(self):
 
     @staticmethod
     def as_langchain_list(message_list: List['Message']):
-        """Convert AgentUniverse(AU) message list to langchain message list """
+        """Convert agentUniverse(aU) message list to langchain message list """
         langchain_message_list = []
         if message_list is None:
             return langchain_message_list
diff --git a/agentuniverse/agent/plan/planner/rag_planner/rag_planner.py b/agentuniverse/agent/plan/planner/rag_planner/rag_planner.py
index 99a3b3f2..26a19c75 100644
--- a/agentuniverse/agent/plan/planner/rag_planner/rag_planner.py
+++ b/agentuniverse/agent/plan/planner/rag_planner/rag_planner.py
@@ -43,7 +43,6 @@ def invoke(self, agent_model: AgentModel, planner_input: dict,
 
         prompt: ChatPrompt = self.handle_prompt(agent_model, planner_input)
         process_llm_token(llm, prompt.as_langchain(), agent_model.profile, planner_input)
-
         llm_chain = LLMChain(llm=llm.as_langchain(),
                              prompt=prompt.as_langchain(),
                              output_key=self.output_key, memory=memory)
diff --git a/agentuniverse/base/agentuniverse.py b/agentuniverse/base/agentuniverse.py
index d8598942..80ea5723 100644
--- a/agentuniverse/base/agentuniverse.py
+++ b/agentuniverse/base/agentuniverse.py
@@ -39,7 +39,7 @@ def __init__(self):
         self.__system_default_llm_package = ['agentuniverse.llm.default']
         self.__system_default_planner_package = ['agentuniverse.agent.plan.planner']
         self.__system_default_memory_package = ['agentuniverse.agent.memory.default']
-        self.__system_default_prompt_package = ['agentuniverse.agent', 'agentuniverse.base.prompt']
+        self.__system_default_prompt_package = ['agentuniverse.agent', 'agentuniverse.base.util']
 
     def start(self, config_path: str = None):
         """Start the agentUniverse framework."""
diff --git a/agentuniverse/base/component/component_base.py b/agentuniverse/base/component/component_base.py
index c6b3220e..bb69c41e 100644
--- a/agentuniverse/base/component/component_base.py
+++ b/agentuniverse/base/component/component_base.py
@@ -7,7 +7,7 @@
 # @FileName: component_base.py
 from abc import ABC
 
-from pydantic import BaseModel
+from pydantic import BaseModel, ConfigDict
 
 from agentuniverse.base.component.component_enum import ComponentEnum
 from agentuniverse.base.config.application_configer.application_config_manager import ApplicationConfigManager
@@ -18,6 +18,8 @@ class ComponentBase(BaseModel):
     """The ComponentBase class, which is used to define the base class of the component."""
 
     component_type: ComponentEnum
+    # pydantic protected_namespaces config
+    model_config = ConfigDict(protected_namespaces=())
 
     def get_instance_code(self) -> str:
         """Return the full name of the component."""
diff --git a/agentuniverse/base/config/component_configer/configers/llm_configer.py b/agentuniverse/base/config/component_configer/configers/llm_configer.py
index e9a0448b..6551f189 100644
--- a/agentuniverse/base/config/component_configer/configers/llm_configer.py
+++ b/agentuniverse/base/config/component_configer/configers/llm_configer.py
@@ -25,6 +25,7 @@ def __init__(self, configer: Optional[Configer] = None):
         self.__max_retries: Optional[int] = None
         self.__streaming: Optional[bool] = None
         self.__ext_info: Optional[dict] = None
+        self.__max_context_length: Optional[int] = None
 
     @property
     def name(self) -> Optional[str]:
@@ -65,6 +66,10 @@ def streaming(self) -> Optional[bool]:
     def ext_info(self) -> Optional[dict]:
         return self.__ext_info
 
+    @property
+    def max_content_length(self) -> Optional[int]:
+        return self.__max_context_length
+
     def load(self) -> 'LLMConfiger':
         """Load the configuration by the Configer object.
         Returns:
@@ -91,6 +96,7 @@ def load_by_configer(self, configer: Configer) -> 'LLMConfiger':
             self.__max_retries = configer.value.get('max_retries')
             self.__streaming = configer.value.get('streaming')
             self.__ext_info = configer.value.get('ext_info')
+            self.__max_context_length = configer.value.get('max_context_length')
         except Exception as e:
             raise Exception(f"Failed to parse the LLM configuration: {e}")
         return self
diff --git a/agentuniverse/base/prompt/__init__.py b/agentuniverse/base/util/prompt/__init__.py
similarity index 83%
rename from agentuniverse/base/prompt/__init__.py
rename to agentuniverse/base/util/prompt/__init__.py
index 645f99e4..973efb79 100644
--- a/agentuniverse/base/prompt/__init__.py
+++ b/agentuniverse/base/util/prompt/__init__.py
@@ -1,7 +1,7 @@
 # !/usr/bin/env python3
 # -*- coding:utf-8 -*-
 
-# @Time    : 2024/4/22 21:04
+# @Time    : 2024/5/28 18:13
 # @Author  : wangchongshi
 # @Email   : wangchongshi.wcs@antgroup.com
 # @FileName: __init__.py.py
diff --git a/agentuniverse/base/prompt/combine_cn_prompt.yaml b/agentuniverse/base/util/prompt/combine_cn_prompt.yaml
similarity index 100%
rename from agentuniverse/base/prompt/combine_cn_prompt.yaml
rename to agentuniverse/base/util/prompt/combine_cn_prompt.yaml
diff --git a/agentuniverse/base/prompt/combine_en_prompt.yaml b/agentuniverse/base/util/prompt/combine_en_prompt.yaml
similarity index 100%
rename from agentuniverse/base/prompt/combine_en_prompt.yaml
rename to agentuniverse/base/util/prompt/combine_en_prompt.yaml
diff --git a/agentuniverse/base/prompt/summary_cn_prompt.yaml b/agentuniverse/base/util/prompt/summary_cn_prompt.yaml
similarity index 100%
rename from agentuniverse/base/prompt/summary_cn_prompt.yaml
rename to agentuniverse/base/util/prompt/summary_cn_prompt.yaml
diff --git a/agentuniverse/base/prompt/summary_en_prompt.yaml b/agentuniverse/base/util/prompt/summary_en_prompt.yaml
similarity index 100%
rename from agentuniverse/base/prompt/summary_en_prompt.yaml
rename to agentuniverse/base/util/prompt/summary_en_prompt.yaml
diff --git a/agentuniverse/base/util/prompt_util.py b/agentuniverse/base/util/prompt_util.py
index 8a7b999b..49a3301e 100644
--- a/agentuniverse/base/util/prompt_util.py
+++ b/agentuniverse/base/util/prompt_util.py
@@ -10,6 +10,7 @@
 from langchain.chains.summarize import load_summarize_chain
 from langchain_core.documents import Document
 
+from agentuniverse.agent.memory.enum import ChatMessageEnum
 from agentuniverse.agent.memory.message import Message
 from agentuniverse.llm.llm import LLM
 from agentuniverse.llm.llm_manager import LLMManager
@@ -120,6 +121,12 @@ def generate_chat_template(agent_prompt_model: AgentPromptModel, prompt_assemble
         if value is not None:
             message_list.append(
                 Message(type=agent_prompt_model.get_message_type(attr), content=value))
+    if message_list:
+        # Integrate the system messages and put them in the first of the message list.
+        system_messages = '\n'.join(msg.content for msg in message_list if msg.type == ChatMessageEnum.SYSTEM.value)
+        if system_messages:
+            message_list = list(filter(lambda msg: msg.type != ChatMessageEnum.SYSTEM.value, message_list))
+            message_list.insert(0, Message(type=ChatMessageEnum.SYSTEM.value, content=system_messages))
     return message_list
 
 
diff --git a/agentuniverse/llm/default/baichuan_openai_style_llm.py b/agentuniverse/llm/default/baichuan_openai_style_llm.py
new file mode 100644
index 00000000..38b58395
--- /dev/null
+++ b/agentuniverse/llm/default/baichuan_openai_style_llm.py
@@ -0,0 +1,43 @@
+# !/usr/bin/env python3
+# -*- coding:utf-8 -*-
+
+# @Time    : 2024/5/21 13:52
+# @Author  : weizjajj
+# @Email   : weizhongjie.wzj@antgroup.com
+# @FileName: baichuan_openai_style_llm.py
+
+from typing import Optional
+
+from langchain_community.chat_models import ChatBaichuan
+from langchain_core.language_models import BaseLanguageModel
+from pydantic import Field
+
+from agentuniverse.base.util.env_util import get_from_env
+from agentuniverse.llm.openai_style_llm import OpenAIStyleLLM
+
+BAICHUAN_Max_CONTEXT_LENGTH = {
+    "Baichuan2-Turbo": 8000,
+    "Baichuan2-Turbo-192k": 192000,
+    "Baichuan3-Turbo": 8000,
+    "Baichuan3-Turbo-128k": 128000,
+    "Baichuan4": 8000
+}
+
+
+class BAICHUANOpenAIStyleLLM(OpenAIStyleLLM):
+    """
+    BAICHUAN OpenAI Style LLM
+    Args:
+        api_key (Optional[str]): API key for the model. Defaults to None.
+        api_base (Optional[str]): API base URL for the model. Defaults to "https://api.openai.com/v1".
+    """
+
+    api_key: Optional[str] = Field(default_factory=lambda: get_from_env("BAICHUAN_API_KEY"))
+    api_base: Optional[str] = "https://api.baichuan-ai.com/v1"
+    proxy: Optional[str] = Field(default_factory=lambda: get_from_env("BAICHUAN_PROXY"))
+    organization: Optional[str] = Field(default_factory=lambda: get_from_env("BAICHUAN_ORGANIZATION"))
+
+    def max_context_length(self) -> int:
+        if super().max_context_length():
+            return super().max_context_length()
+        return BAICHUAN_Max_CONTEXT_LENGTH.get(self.model_name, 8000)
diff --git a/agentuniverse/llm/default/baichuan_openai_style_llm.yaml b/agentuniverse/llm/default/baichuan_openai_style_llm.yaml
new file mode 100644
index 00000000..96bfbd6b
--- /dev/null
+++ b/agentuniverse/llm/default/baichuan_openai_style_llm.yaml
@@ -0,0 +1,10 @@
+name: 'default_baichuan_llm'
+description: 'default baichuan llm with spi'
+model_name: 'Baichuan2-Turbo'
+max_tokens: 1000
+api_key_name: 'BAICHUAN_API_KEY'
+api_base_name: 'BAICHUAN_API_BASE'
+metadata:
+  type: 'LLM'
+  module: 'agentuniverse.llm.default.baichuan_openai_style_llm'
+  class: 'BAICHUANOpenAIStyleLLM'
\ No newline at end of file
diff --git a/agentuniverse/llm/default/default_openai_llm.py b/agentuniverse/llm/default/default_openai_llm.py
index 4de13d34..38987727 100644
--- a/agentuniverse/llm/default/default_openai_llm.py
+++ b/agentuniverse/llm/default/default_openai_llm.py
@@ -5,18 +5,47 @@
 # @Author  : wangchongshi
 # @Email   : wangchongshi.wcs@antgroup.com
 # @FileName: default_openai_llm.py
-from typing import Any
+from typing import Any, Optional
 
+from pydantic import Field
+
+from agentuniverse.base.util.env_util import get_from_env
 from agentuniverse.llm.llm_output import LLMOutput
-from agentuniverse.llm.openai_llm import OpenAILLM
+from agentuniverse.llm.openai_style_llm import OpenAIStyleLLM
+
+
+OPENAI_MAX_CONTEXT_LENGTH = {
+    "gpt-3.5-turbo": 4096,
+    "gpt-3.5-turbo-0301": 4096,
+    "gpt-3.5-turbo-0613": 4096,
+    "gpt-3.5-turbo-16k": 16384,
+    "gpt-3.5-turbo-16k-0613": 16384,
+    "gpt-35-turbo": 4096,
+    "gpt-35-turbo-16k": 16384,
+    "gpt-3.5-turbo-1106": 16384,
+    "gpt-3.5-turbo-0125": 16384,
+    "gpt-4-0314": 8192,
+    "gpt-4": 8192,
+    "gpt-4-32k": 32768,
+    "gpt-4-32k-0613": 32768,
+    "gpt-4-0613": 8192,
+    "gpt-4-1106-preview": 128000,
+    "gpt-4-turbo": 128000,
+    "gpt-4o": 128000,
+    "gpt-4o-2024-05-13": 128000,
+}
 
 
-class DefaultOpenAILLM(OpenAILLM):
+class DefaultOpenAILLM(OpenAIStyleLLM):
     """The agentUniverse default openai llm module.
 
     LLM parameters, such as name/description/model_name/max_tokens,
     are injected into this class by the default_openai_llm.yaml configuration.
     """
+    api_key: Optional[str] = Field(default_factory=lambda: get_from_env("OPENAI_API_KEY"))
+    organization: Optional[str] = Field(default_factory=lambda: get_from_env("OPENAI_ORGANIZATION"))
+    api_base: Optional[str] = Field(default_factory=lambda: get_from_env("OPENAI_API_BASE"))
+    proxy: Optional[str] = Field(default_factory=lambda: get_from_env("OPENAI_PROXY"))
 
     def call(self, messages: list, **kwargs: Any) -> LLMOutput:
         """ The call method of the LLM.
@@ -39,3 +68,10 @@ async def acall(self, messages: list, **kwargs: Any) -> LLMOutput:
             **kwargs: Arbitrary keyword arguments.
         """
         return await super().acall(messages, **kwargs)
+
+    def max_context_length(self) -> int:
+        """Max context length.
+
+          The total length of input tokens and generated tokens is limited by the openai model's context length.
+          """
+        return OPENAI_MAX_CONTEXT_LENGTH.get(self.model_name, 4096)
diff --git a/agentuniverse/llm/default/kimi_openai_style_llm.py b/agentuniverse/llm/default/kimi_openai_style_llm.py
new file mode 100644
index 00000000..122f8175
--- /dev/null
+++ b/agentuniverse/llm/default/kimi_openai_style_llm.py
@@ -0,0 +1,47 @@
+# !/usr/bin/env python3
+# -*- coding:utf-8 -*-
+
+# @Time    : 2024/5/21 13:52
+# @Author  : weizjajj
+# @Email   : weizhongjie.wzj@antgroup.com
+# @FileName: kimi_openai_style_llm.py
+
+from typing import Optional
+
+import requests
+from pydantic import Field
+
+from agentuniverse.base.util.env_util import get_from_env
+from agentuniverse.llm.openai_style_llm import OpenAIStyleLLM
+
+KIMI_Max_CONTEXT_LENGTH = {
+    "moonshot-v1-8k": 8000,
+    "moonshot-v1-32k": 32000,
+    "moonshot-v1-128k": 128000
+}
+
+
+class KIMIOpenAIStyleLLM(OpenAIStyleLLM):
+    """
+        KIMI's OpenAI Style LLM
+        Attributes:
+            api_key (Optional[str]): The API key to use for authentication. Defaults to None.
+            api_base (Optional[str]): The base URL to use for the API. Defaults to None.
+    """
+    api_key: Optional[str] = Field(default_factory=lambda: get_from_env("KIMI_API_KEY"))
+    api_base: Optional[str] = "https://api.moonshot.cn/v1"
+    proxy: Optional[str] = Field(default_factory=lambda: get_from_env("KIMI_PROXY"))
+    organization: Optional[str] = Field(default_factory=lambda: get_from_env("KIMI_ORGANIZATION"))
+
+    def max_context_length(self) -> int:
+        if super().max_context_length():
+            return super().max_context_length()
+        return KIMI_Max_CONTEXT_LENGTH.get(self.model_name, 8000)
+
+    def get_num_tokens(self, text: str) -> int:
+        # 通过http获取token数量
+        messages = [{"role": "user", "content": text}]
+        body = {"model": self.model_name, "messages": messages}
+        headers = {'Content-Type': 'application/json', 'Authorization': f'Bearer {self.api_key}'}
+        res = requests.post(f"{self.api_base}/tokenizers/estimate-token-count", headers=headers, json=body)
+        return res.json().get('data').get('total_tokens')
diff --git a/agentuniverse/llm/default/kimi_openai_style_llm.yaml b/agentuniverse/llm/default/kimi_openai_style_llm.yaml
new file mode 100644
index 00000000..80727763
--- /dev/null
+++ b/agentuniverse/llm/default/kimi_openai_style_llm.yaml
@@ -0,0 +1,8 @@
+name: 'default_kimi_llm'
+description: 'default kimi llm with spi'
+model_name: 'moonshot-v1-8k'
+max_tokens: 1000
+metadata:
+  type: 'LLM'
+  module: 'agentuniverse.llm.default.kimi_openai_style_llm'
+  class: 'KIMIOpenAIStyleLLM'
\ No newline at end of file
diff --git a/agentuniverse/llm/default/qwen_openai_style_llm.py b/agentuniverse/llm/default/qwen_openai_style_llm.py
new file mode 100644
index 00000000..2816c32e
--- /dev/null
+++ b/agentuniverse/llm/default/qwen_openai_style_llm.py
@@ -0,0 +1,49 @@
+# !/usr/bin/env python3
+# -*- coding:utf-8 -*-
+
+# @Time    : 2024/5/21 13:52
+# @Author  : weizjajj
+# @Email   : weizhongjie.wzj@antgroup.com
+# @FileName: qwen_openai_style_llm.py
+
+from typing import Optional
+
+from dashscope import get_tokenizer
+from pydantic import Field
+
+from agentuniverse.base.util.env_util import get_from_env
+from agentuniverse.llm.openai_style_llm import OpenAIStyleLLM
+
+QWen_Max_CONTEXT_LENGTH = {
+    "qwen-turbo": 6000,
+    "qwen-plus": 300000,
+    "qwen-max": 6000,
+    "qwen-max-0428": 6000,
+    "qwen-max-0403": 6000,
+    "qwen-max-0107": 6000,
+    "qwen-max-longcontext": 28000
+}
+
+
+class QWenOpenAIStyleLLM(OpenAIStyleLLM):
+
+    """
+        QWen OpenAI style LLM
+        Args:
+            api_key: API key for the model ,from dashscope : DASHSCOPE_API_KEY
+            api_base: API base URL for the model, from dashscope : DASHSCOPE_API_BASE
+    """
+
+    api_key: Optional[str] = Field(default_factory=lambda: get_from_env("DASHSCOPE_API_KEY"))
+    api_base: Optional[str] = "https://dashscope.aliyuncs.com/compatible-mode/v1"
+    proxy: Optional[str] = Field(default_factory=lambda: get_from_env("DASHSCOPE_PROXY"))
+    organization: Optional[str] = Field(default_factory=lambda: get_from_env("DASHSCOPE_ORGANIZATION"))
+
+    def max_context_length(self) -> int:
+        if super().max_context_length():
+            return super().max_context_length()
+        return QWen_Max_CONTEXT_LENGTH.get(self.model_name, 8000)
+
+    def get_num_tokens(self, text: str) -> int:
+        tokenizer = get_tokenizer(self.model_name)
+        return len(tokenizer.encode(text))
diff --git a/agentuniverse/llm/default/qwen_openai_style_llm.yaml b/agentuniverse/llm/default/qwen_openai_style_llm.yaml
new file mode 100644
index 00000000..c9a1a4f5
--- /dev/null
+++ b/agentuniverse/llm/default/qwen_openai_style_llm.yaml
@@ -0,0 +1,8 @@
+name: 'default_qwen_llm'
+description: 'default openai llm with spi'
+model_name: 'qwen-turbo'
+max_tokens: 1000
+metadata:
+  type: 'LLM'
+  module: 'agentuniverse.llm.default.qwen_openai_style_llm'
+  class: 'QWenOpenAIStyleLLM'
\ No newline at end of file
diff --git a/agentuniverse/llm/default/wenxin_llm.py b/agentuniverse/llm/default/wenxin_llm.py
new file mode 100644
index 00000000..44ee53d9
--- /dev/null
+++ b/agentuniverse/llm/default/wenxin_llm.py
@@ -0,0 +1,138 @@
+# !/usr/bin/env python3
+# -*- coding:utf-8 -*-
+
+# @Time    : 2024/5/21 13:52
+# @Author  : weizjajj 
+# @Email   : weizhongjie.wzj@antgroup.com
+# @FileName: wenxin_llm.py
+
+from typing import Any, Union, AsyncIterator, Iterator
+
+import qianfan
+from langchain_community.chat_models import QianfanChatEndpoint
+from langchain_core.language_models import BaseLanguageModel
+from pydantic import Field
+from qianfan import QfResponse
+from qianfan.resources.tools import tokenizer
+
+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.wenxin_langchain_instance import WenXinLangChainInstance
+
+TokenModelList = [
+    'Ernie-4.0-8k',
+    'ernie-3.5-8k',
+    'ernie-speed-8k',
+    'ernie-speed-128k',
+    'ernie-lite-8k',
+    'ernie-tiny-8k',
+    'ernie-char-8k',
+]
+
+
+class WenXinLLM(LLM):
+    """WenXin LLM wrapper for LangChain.
+        This is a wrapper around the Qianfan Chat Completion API.
+        It uses the QianfanChatEndpoint class from the langchain_community package.
+        It also supports streaming and token counting.
+        It can be used with any other LangChain tools or agents.
+
+        Attributes:
+            qianfan_ak (str): The access key of the Qianfan API.
+                Defaults to the value of the QIANFAN_AK environment variable.
+            qianfan_sk (str): The secret key of the Qianfan API.
+                Defaults to the value of the QIANFAN_SK environment variable.
+    """
+    qianfan_ak: str = Field(default_factory=lambda: get_from_env("QIANFAN_AK"))
+    qianfan_sk: str = Field(default_factory=lambda: get_from_env("QIANFAN_SK"))
+
+    def _new_client(self):
+        """Create a new Qianfan client."""
+        return qianfan.ChatCompletion(ak=self.qianfan_ak, sk=self.qianfan_sk)
+
+    def call(self, messages: list, **kwargs: Any) -> Union[LLMOutput, Iterator[LLMOutput]]:
+        """Run the OpenAI LLM.
+
+        Args:
+            messages (list): The messages to send to the LLM.
+            **kwargs: Arbitrary keyword arguments.
+        """
+        streaming = kwargs.pop("streaming") if "streaming" in kwargs else self.streaming
+        self.client = self._new_client()
+        client = self.client
+        chat_completion = client.do(
+            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:
+            return self.parse_result(chat_completion)
+        return self.generate_stream_result(chat_completion)
+
+    async def acall(self, messages: list, **kwargs: Any) -> Union[LLMOutput, AsyncIterator[LLMOutput]]:
+        """Asynchronously run the OpenAI LLM.
+
+        Args:
+            messages (list): The messages to send to the LLM.
+            **kwargs: Arbitrary keyword arguments.
+        """
+        streaming = kwargs.pop("streaming") if "streaming" in kwargs else self.streaming
+        self.async_client = self._new_client()
+        async_client = self.async_client
+        chat_completion = await async_client.ado(
+            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:
+            return self.parse_result(chat_completion)
+        return self.agenerate_stream_result(chat_completion)
+
+    def max_context_length(self) -> int:
+        if super().max_context_length():
+            return super().max_context_length()
+        res = self._new_client().get_model_info(self.model_name)
+        if res.max_input_tokens:
+            return res.max_input_tokens
+        return res.max_input_chars
+
+    def get_num_tokens(self, text: str) -> int:
+        model_name = ''
+        if self.model_name.lower() in TokenModelList:
+            model_name = self.model_name.lower()
+        token_cnt = tokenizer.Tokenizer().count_tokens(
+            text=text,
+            mode='remote',
+            model=model_name
+        )
+        return token_cnt
+
+    @staticmethod
+    def parse_result(chunk: QfResponse):
+        text = chunk.body.get('result')
+        if not text:
+            return None
+        return LLMOutput(text=text, raw=chunk)
+
+    def generate_stream_result(self, chat_completion) -> Iterator[LLMOutput]:
+        for chunk in chat_completion:
+            data = self.parse_result(chunk)
+            if data:
+                yield data
+
+    async def agenerate_stream_result(self, chat_completion: AsyncIterator) -> AsyncIterator[LLMOutput]:
+        async for chunk in chat_completion:
+            data = self.parse_result(chunk)
+            if data:
+                yield data
+
+    def as_langchain(self) -> BaseLanguageModel:
+        """Return an instance of the LangChain `BaseLanguageModel` class."""
+        return WenXinLangChainInstance(llm=self)
diff --git a/agentuniverse/llm/default/wenxin_llm.yaml b/agentuniverse/llm/default/wenxin_llm.yaml
new file mode 100644
index 00000000..2f67766b
--- /dev/null
+++ b/agentuniverse/llm/default/wenxin_llm.yaml
@@ -0,0 +1,9 @@
+name: 'default_wenxin_llm'
+description: 'default openai llm with spi'
+model_name: 'ERNIE-3.5-8K'
+max_tokens: 1000
+streaming: true
+metadata:
+  type: 'LLM'
+  module: 'agentuniverse.llm.default.wenxin_llm'
+  class: 'WenXinLLM'
\ No newline at end of file
diff --git a/agentuniverse/llm/langchain_instance.py b/agentuniverse/llm/langchain_instance.py
index 0c61ad05..eb9f965f 100644
--- a/agentuniverse/llm/langchain_instance.py
+++ b/agentuniverse/llm/langchain_instance.py
@@ -28,10 +28,10 @@ def __init__(self, llm: LLM):
         """The __init__ method.
 
         The agentUniverse LLM instance is passed to this class as an argument.
-        Convert the attributes of AgentUniverse(AU) LLM instance to the LangchainOpenAI object for initialization
+        Convert the attributes of agentUniverse(aU) LLM instance to the LangchainOpenAI object for initialization
 
         Args:
-            llm (LLM): the AgentUniverse(AU) LLM instance.
+            llm (LLM): the agentUniverse(aU) LLM instance.
         """
         init_params = dict()
         init_params['model_name'] = llm.model_name if llm.model_name else 'gpt-3.5-turbo'
diff --git a/agentuniverse/llm/llm.py b/agentuniverse/llm/llm.py
index f56ebb87..23c97d26 100644
--- a/agentuniverse/llm/llm.py
+++ b/agentuniverse/llm/llm.py
@@ -44,6 +44,7 @@ class LLM(ComponentBase):
     max_retries: Optional[int] = 2
     streaming: Optional[bool] = False
     ext_info: Optional[dict] = None
+    __max_context_length: Optional[int] = None
 
     def __init__(self, **kwargs):
         """Initialize the llm."""
@@ -100,6 +101,7 @@ def initialize_by_component_configer(self, component_configer: LLMConfiger) -> '
             self.streaming = component_configer.streaming
         if component_configer.ext_info:
             self.ext_info = component_configer.ext_info
+
         return self
 
     def set_by_agent_model(self, **kwargs) -> None:
@@ -116,13 +118,15 @@ def set_by_agent_model(self, **kwargs) -> None:
             self.max_retries = kwargs['max_retries']
         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']
 
-    @abstractmethod
     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
 
     @abstractmethod
     def get_num_tokens(self, text: str) -> int:
@@ -136,3 +140,6 @@ def get_num_tokens(self, text: str) -> int:
         Returns:
             The integer number of tokens in the text.
         """
+
+    class Config:
+        protected_namespaces = ()
diff --git a/agentuniverse/llm/openai_llm.py b/agentuniverse/llm/openai_llm.py
index 69896993..1839b036 100644
--- a/agentuniverse/llm/openai_llm.py
+++ b/agentuniverse/llm/openai_llm.py
@@ -93,20 +93,20 @@ 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
-        self.client = self._new_client()
-        with self.client as client:
-            chat_completion = client.chat.completions.create(
-                messages=messages,
-                model=kwargs.pop('model', self.model_name),
-                temperature=kwargs.pop('temperature', self.temperature),
-                stream=kwargs.pop('stream', streaming),
-                max_tokens=kwargs.pop('max_tokens', self.max_tokens),
-                **kwargs,
-            )
-            if not streaming:
-                text = chat_completion.choices[0].message.content
-                return LLMOutput(text=text, raw=chat_completion.model_dump())
-            return self.generate_stream_result(chat_completion)
+        if self.client is None:
+            self.client = self._new_client()
+        chat_completion = self.client.chat.completions.create(
+            messages=messages,
+            model=kwargs.pop('model', self.model_name),
+            temperature=kwargs.pop('temperature', self.temperature),
+            stream=kwargs.pop('stream', streaming),
+            max_tokens=kwargs.pop('max_tokens', self.max_tokens),
+            **kwargs,
+        )
+        if not streaming:
+            text = chat_completion.choices[0].message.content
+            return LLMOutput(text=text, raw=chat_completion.model_dump())
+        return self.generate_stream_result(chat_completion)
 
     async def acall(self, messages: list, **kwargs: Any) -> Union[LLMOutput, AsyncIterator[LLMOutput]]:
         """Asynchronously run the OpenAI LLM.
@@ -116,23 +116,23 @@ async def acall(self, messages: list, **kwargs: Any) -> Union[LLMOutput, AsyncIt
             **kwargs: Arbitrary keyword arguments.
         """
         streaming = kwargs.pop("streaming") if "streaming" in kwargs else self.streaming
-        self.async_client = self._new_async_client()
-        async with self.async_client as async_client:
-            chat_completion = await async_client.chat.completions.create(
-                messages=messages,
-                model=kwargs.pop('model', self.model_name),
-                temperature=kwargs.pop('temperature', self.temperature),
-                stream=kwargs.pop('stream', streaming),
-                max_tokens=kwargs.pop('max_tokens', self.max_tokens),
-                **kwargs,
-            )
-            if not streaming:
-                text = chat_completion.choices[0].message.content
-                return LLMOutput(text=text, raw=chat_completion.model_dump())
-            return self.agenerate_stream_result(chat_completion)
+        if self.async_client is None:
+            self.async_client = self._new_async_client()
+        chat_completion = await self.async_client.chat.completions.create(
+            messages=messages,
+            model=kwargs.pop('model', self.model_name),
+            temperature=kwargs.pop('temperature', self.temperature),
+            stream=kwargs.pop('stream', streaming),
+            max_tokens=kwargs.pop('max_tokens', self.max_tokens),
+            **kwargs,
+        )
+        if not streaming:
+            text = chat_completion.choices[0].message.content
+            return LLMOutput(text=text, raw=chat_completion.model_dump())
+        return self.agenerate_stream_result(chat_completion)
 
     def as_langchain(self) -> BaseLanguageModel:
-        """Convert the AgentUniverse(AU) openai llm class to the langchain openai llm class."""
+        """Convert the agentUniverse(aU) openai llm class to the langchain openai llm class."""
         return LangchainOpenAI(self)
 
     def set_by_agent_model(self, **kwargs) -> None:
diff --git a/agentuniverse/llm/openai_style_langchain_instance.py b/agentuniverse/llm/openai_style_langchain_instance.py
new file mode 100644
index 00000000..582361a5
--- /dev/null
+++ b/agentuniverse/llm/openai_style_langchain_instance.py
@@ -0,0 +1,132 @@
+# !/usr/bin/env python3
+# -*- coding:utf-8 -*-
+
+# @Time    : 2024/5/21 13:52
+# @Author  : weizjajj
+# @Email   : weizhongjie.wzj@antgroup.com
+# @FileName: langchain_openai_style_instance.py
+
+from typing import Any, List, Optional, AsyncIterator
+
+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_core.language_models.chat_models import generate_from_stream, agenerate_from_stream
+from langchain_core.messages import AIMessageChunk
+from langchain_core.outputs import ChatGenerationChunk
+from langchain_community.chat_models import ChatOpenAI
+
+from agentuniverse.llm.llm import LLM
+
+
+class LangchainOpenAIStyleInstance(ChatOpenAI):
+    """Langchain OpenAI LLM wrapper."""
+
+    llm: Optional[LLM] = None
+
+    def __init__(self, llm: LLM):
+        """The __init__ method.
+
+        The agentUniverse LLM instance is passed to this class as an argument.
+        Convert the attributes of agentUniverse(aU) LLM instance to the LangchainOpenAI object for initialization
+
+        Args:
+            llm (LLM): the agentUniverse(aU) LLM instance.
+        """
+        init_params = dict()
+        init_params['model_name'] = llm.model_name if llm.model_name else 'gpt-3.5-turbo'
+        init_params['temperature'] = llm.temperature if llm.temperature else 0.7
+        init_params['request_timeout'] = llm.request_timeout
+        init_params['max_tokens'] = llm.max_tokens
+        init_params['max_retries'] = llm.max_retries if llm.max_retries else 2
+        init_params['streaming'] = llm.streaming if llm.streaming else False
+        init_params['openai_api_key'] = llm.api_key if llm.api_key else 'blank'
+        init_params['openai_organization'] = llm.organization
+        init_params['openai_api_base'] = llm.api_base
+        init_params['openai_proxy'] = llm.proxy
+        super().__init__(**init_params)
+        self.llm = llm
+
+    def _generate(
+            self,
+            messages: List[BaseMessage],
+            stop: Optional[List[str]] = None,
+            run_manager: Optional[CallbackManagerForLLMRun] = None,
+            stream: Optional[bool] = None,
+            **kwargs,
+    ) -> ChatResult:
+        """Run the Langchain OpenAI LLM."""
+        should_stream = stream if stream is not None else self.streaming
+        message_dicts, params = self._create_message_dicts(messages, stop)
+        params = {**params, **kwargs}
+        llm_output = self.llm.call(messages=message_dicts, **params)
+        if not should_stream:
+            return self._create_chat_result(llm_output.raw)
+        stream_iter = self.as_langchain_chunk(llm_output)
+        return generate_from_stream(stream_iter)
+
+    async def _agenerate(
+            self,
+            messages: List[BaseMessage],
+            stop: Optional[List[str]] = None,
+            run_manager: Optional[AsyncCallbackManagerForLLMRun] = None,
+            stream: Optional[bool] = None,
+            **kwargs: Any,
+    ) -> ChatResult:
+
+        """Asynchronously run the Langchain OpenAI LLM."""
+        should_stream = stream if stream is not None else self.streaming
+        message_dicts, params = self._create_message_dicts(messages, stop)
+        params = {**params, **kwargs}
+        llm_output = await self.llm.acall(messages=message_dicts, **params)
+        if not should_stream:
+            return self._create_chat_result(llm_output.raw)
+        stream_iter = self.as_langchain_achunk(llm_output)
+        return await agenerate_from_stream(stream_iter)
+
+    @staticmethod
+    def as_langchain_chunk(stream, run_manager=None):
+        default_chunk_class = AIMessageChunk
+        for llm_result in stream:
+            chunk = llm_result.raw
+            if not isinstance(chunk, dict):
+                chunk = chunk.dict()
+            if len(chunk["choices"]) == 0:
+                continue
+            choice = chunk["choices"][0]
+            chunk = _convert_delta_to_message_chunk(
+                choice["delta"], default_chunk_class
+            )
+            finish_reason = choice.get("finish_reason")
+            generation_info = (
+                dict(finish_reason=finish_reason) if finish_reason is not None else None
+            )
+            default_chunk_class = chunk.__class__
+            chunk = ChatGenerationChunk(message=chunk, generation_info=generation_info)
+            yield chunk
+            if run_manager:
+                run_manager.on_llm_new_token(chunk.text, chunk=chunk)
+
+    @staticmethod
+    async def as_langchain_achunk(stream_iterator: AsyncIterator, run_manager=None) \
+            -> AsyncIterator[ChatGenerationChunk]:
+        default_chunk_class = AIMessageChunk
+        async for llm_result in stream_iterator:
+            chunk = llm_result.raw
+            if not isinstance(chunk, dict):
+                chunk = chunk.dict()
+            if len(chunk["choices"]) == 0:
+                continue
+            choice = chunk["choices"][0]
+            chunk = _convert_delta_to_message_chunk(
+                choice["delta"], default_chunk_class
+            )
+            finish_reason = choice.get("finish_reason")
+            generation_info = (
+                dict(finish_reason=finish_reason) if finish_reason is not None else None
+            )
+            default_chunk_class = chunk.__class__
+            chunk = ChatGenerationChunk(message=chunk, generation_info=generation_info)
+            yield chunk
+            if run_manager:
+                await run_manager.on_llm_new_token(token=chunk.text, chunk=chunk)
diff --git a/agentuniverse/llm/openai_style_llm.py b/agentuniverse/llm/openai_style_llm.py
new file mode 100644
index 00000000..4a668374
--- /dev/null
+++ b/agentuniverse/llm/openai_style_llm.py
@@ -0,0 +1,186 @@
+# !/usr/bin/env python3
+# -*- coding:utf-8 -*-
+
+# @Time    : 2024/5/21 13:52
+# @Author  : weizjajj
+# @Email   : weizhongjie.wzj@antgroup.com
+# @FileName: openai_style_llm.py
+
+from typing import Any, Optional, AsyncIterator, Iterator, Union
+
+import httpx
+import openai
+import tiktoken
+from langchain_core.language_models.base import BaseLanguageModel
+from openai import OpenAI, AsyncOpenAI
+
+from agentuniverse.llm.llm import LLM, LLMOutput
+from agentuniverse.llm.openai_style_langchain_instance import LangchainOpenAIStyleInstance
+
+
+class OpenAIStyleLLM(LLM):
+    """
+    This is a wrapper around the OpenAI API that implements a chat interface for the LLM.
+    It uses the `chat` endpoint of the OpenAI API.
+    It also supports using the `completion` endpoint instead of the `chat` endpoint.
+    It supports both sync and async modes.
+    Attributes:
+        api_key (Optional[str]): The API key to use for authentication.
+        organization (Optional[str]): The organization ID to use for authentication.
+        api_base (Optional[str]): The base URL to use for the API requests.
+        proxy (Optional[str]): The proxy to use for the API requests.
+        client_args (Optional[dict]): Additional arguments to pass to the client.
+    """
+
+    api_key: Optional[str] = None
+    organization: Optional[str] = None
+    api_base: Optional[str] = None
+    proxy: Optional[str] = None
+    client_args: Optional[dict] = None
+
+    def _new_client(self):
+        """Initialize the openai client."""
+        return OpenAI(
+            api_key=self.api_key,
+            organization=self.organization,
+            base_url=self.api_base,
+            timeout=self.request_timeout,
+            max_retries=self.max_retries,
+            http_client=httpx.Client(proxy=self.openai_proxy) if self.proxy else None,
+            **(self.client_args or {}),
+        )
+
+    def _new_async_client(self):
+        """Initialize the openai async client."""
+        return AsyncOpenAI(
+            api_key=self.api_key,
+            organization=self.organization,
+            base_url=self.api_base,
+            timeout=self.request_timeout,
+            max_retries=self.max_retries,
+            http_client=httpx.AsyncClient(proxy=self.proxy) if self.proxy else None,
+            **(self.client_args or {}),
+        )
+
+    def call(self, messages: list, **kwargs: Any) -> Union[LLMOutput, Iterator[LLMOutput]]:
+        """Run the OpenAI LLM.
+
+        Args:
+            messages (list): The messages to send to the LLM.
+            **kwargs: Arbitrary keyword arguments.
+        """
+        streaming = kwargs.pop("streaming") if "streaming" in kwargs else self.streaming
+        self.client = self._new_client()
+        client = self.client
+        chat_completion = client.chat.completions.create(
+            messages=messages,
+            model=kwargs.pop('model', self.model_name),
+            temperature=kwargs.pop('temperature', self.temperature),
+            stream=kwargs.pop('stream', streaming),
+            max_tokens=kwargs.pop('max_tokens', self.max_tokens),
+            **kwargs,
+        )
+        if not streaming:
+            text = chat_completion.choices[0].message.content
+            self.close()
+            return LLMOutput(text=text, raw=chat_completion.model_dump())
+        return self.generate_stream_result(chat_completion)
+
+    async def acall(self, messages: list, **kwargs: Any) -> Union[LLMOutput, AsyncIterator[LLMOutput]]:
+        """Asynchronously run the OpenAI LLM.
+
+        Args:
+            messages (list): The messages to send to the LLM.
+            **kwargs: Arbitrary keyword arguments.
+        """
+        streaming = kwargs.pop("streaming") if "streaming" in kwargs else self.streaming
+        self.async_client = self._new_async_client()
+        async_client = self.async_client
+        chat_completion = await async_client.chat.completions.create(
+            messages=messages,
+            model=kwargs.pop('model', self.model_name),
+            temperature=kwargs.pop('temperature', self.temperature),
+            stream=kwargs.pop('stream', streaming),
+            max_tokens=kwargs.pop('max_tokens', self.max_tokens),
+            **kwargs,
+        )
+        if not streaming:
+            text = chat_completion.choices[0].message.content
+            await self.aclose()
+            return LLMOutput(text=text, raw=chat_completion.model_dump())
+        return self.agenerate_stream_result(chat_completion)
+
+    def as_langchain(self) -> BaseLanguageModel:
+        """Convert the AgentUniverse(AU) openai llm class to the langchain openai llm class."""
+        return LangchainOpenAIStyleInstance(self)
+
+    def set_by_agent_model(self, **kwargs) -> None:
+        """ Assign values of parameters to the OpenAILLM model in the agent configuration."""
+        super().set_by_agent_model(**kwargs)
+        if 'api_key' in kwargs and kwargs['api_key']:
+            self.api_key = kwargs['api_key']
+        if 'api_base' in kwargs and kwargs['api_base']:
+            self.api_base = kwargs['api_base']
+        if 'proxy' in kwargs and kwargs['proxy']:
+            self.proxy = kwargs['proxy']
+        if 'client_args' in kwargs and kwargs['client_args']:
+            self.client_args = kwargs['client_args']
+
+    @staticmethod
+    def parse_result(chunk):
+        """Generate the result of the stream."""
+        chat_completion = chunk
+        if not isinstance(chunk, dict):
+            chunk = chunk.dict()
+        if len(chunk["choices"]) == 0:
+            return
+        choice = chunk["choices"][0]
+        message = choice.get("delta")
+        text = message.get("content")
+        if not text:
+            return
+        return LLMOutput(text=text, raw=chat_completion.model_dump())
+
+    def generate_stream_result(self, stream: openai.Stream):
+        """Generate the result of the stream."""
+        for chunk in stream:
+            llm_output = self.parse_result(chunk)
+            if llm_output:
+                yield llm_output
+        self.close()
+
+    async def agenerate_stream_result(self, stream: AsyncIterator) -> AsyncIterator[LLMOutput]:
+        """Generate the result of the stream."""
+        async for chunk in stream:
+            llm_output = self.parse_result(chunk)
+            if llm_output:
+                yield llm_output
+
+        await self.aclose()
+
+    def get_num_tokens(self, text: str) -> int:
+        """Get the number of tokens present in the text.
+
+        Useful for checking if an input will fit in an openai model's context window.
+
+        Args:
+            text: The string input to tokenize.
+
+        Returns:
+            The integer number of tokens in the text.
+        """
+        try:
+            encoding = tiktoken.encoding_for_model(self.model_name)
+        except KeyError:
+            encoding = tiktoken.get_encoding("cl100k_base")
+        return len(encoding.encode(text))
+
+    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.close()
diff --git a/agentuniverse/llm/wenxin_langchain_instance.py b/agentuniverse/llm/wenxin_langchain_instance.py
new file mode 100644
index 00000000..feb1ed3d
--- /dev/null
+++ b/agentuniverse/llm/wenxin_langchain_instance.py
@@ -0,0 +1,202 @@
+# !/usr/bin/env python3
+# -*- coding:utf-8 -*-
+
+# @Time    : 2024/5/22 16:01
+# @Author  : weizjajj 
+# @Email   : weizhongjie.wzj@antgroup.com
+# @FileName: wenxin_langchain_instance.py
+
+
+from typing import List, Optional, Any, Dict, Iterator, AsyncIterator
+
+from langchain_community.chat_models import QianfanChatEndpoint
+from langchain_community.chat_models.baidu_qianfan_endpoint import _convert_dict_to_message
+from langchain_core.callbacks import CallbackManagerForLLMRun, AsyncCallbackManagerForLLMRun
+from langchain_core.messages import BaseMessage, AIMessage, AIMessageChunk
+from langchain_core.outputs import ChatResult, ChatGeneration, ChatGenerationChunk
+
+from agentuniverse.llm.llm import LLM
+
+
+class WenXinLangChainInstance(QianfanChatEndpoint):
+    llm: LLM = None
+
+    def __init__(self, llm: LLM):
+        init_params = {"qianfan_ak": llm.qianfan_ak, "qianfan_sk": llm.qianfan_sk, "model": llm.model_name,
+                       "max_tokens": llm.max_tokens, "timeout": llm.request_timeout,
+                       'max_retries': llm.max_retries if llm.max_retries else 2,
+                       'streaming': llm.streaming if llm.streaming else False,
+                       'temperature': llm.temperature if llm.temperature else 0.7, '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:
+        """Call out to an qianfan models endpoint for each generation with a prompt.
+              Args:
+                  messages: The messages to pass into the model.
+                  stop: Optional list of stop words to use when generating.
+              Returns:
+                  The string generated by the model.
+
+              Example:
+                  .. code-block:: python
+                      response = qianfan_model.invoke("Tell me a joke.")
+              """
+        if self.streaming:
+            completion = ""
+            token_usage = {}
+            chat_generation_info: Dict = {}
+            for chunk in self._stream(messages, stop, run_manager, **kwargs):
+                chat_generation_info = (
+                    chunk.generation_info
+                    if chunk.generation_info is not None
+                    else chat_generation_info
+                )
+                completion += chunk.text
+            lc_msg = AIMessage(content=completion, additional_kwargs={})
+            gen = ChatGeneration(
+                message=lc_msg,
+                generation_info=dict(finish_reason="stop"),
+            )
+            return ChatResult(
+                generations=[gen],
+                llm_output={
+                    "token_usage": chat_generation_info.get("usage", {}),
+                    "model_name": self.model,
+                },
+            )
+        params = self._convert_prompt_msg_params(messages, **kwargs)
+        params["stop"] = stop
+        response_payload = self.llm.call(**params).raw
+        lc_msg = _convert_dict_to_message(response_payload)
+        gen = ChatGeneration(
+            message=lc_msg,
+            generation_info={
+                "finish_reason": "stop",
+                **response_payload.get("body", {}),
+            },
+        )
+        token_usage = response_payload.get("usage", {})
+        llm_output = {"token_usage": token_usage, "model_name": self.model}
+        return ChatResult(generations=[gen], llm_output=llm_output)
+
+    async def _agenerate(
+        self,
+        messages: List[BaseMessage],
+        stop: Optional[List[str]] = None,
+        run_manager: Optional[AsyncCallbackManagerForLLMRun] = None,
+        **kwargs: Any,
+    ) -> ChatResult:
+        if self.streaming:
+            completion = ""
+            token_usage = {}
+            chat_generation_info: Dict = {}
+            async for chunk in self._astream(messages, stop, run_manager, **kwargs):
+                chat_generation_info = (
+                    chunk.generation_info
+                    if chunk.generation_info is not None
+                    else chat_generation_info
+                )
+                completion += chunk.text
+
+            lc_msg = AIMessage(content=completion, additional_kwargs={})
+            gen = ChatGeneration(
+                message=lc_msg,
+                generation_info=dict(finish_reason="stop"),
+            )
+            return ChatResult(
+                generations=[gen],
+                llm_output={
+                    "token_usage": chat_generation_info.get("usage", {}),
+                    "model_name": self.model,
+                },
+            )
+        params = self._convert_prompt_msg_params(messages, **kwargs)
+        params["stop"] = stop
+        response_payload = await self.llm.acall(**params)
+        response_payload = response_payload.raw
+        lc_msg = _convert_dict_to_message(response_payload)
+        generations = []
+        gen = ChatGeneration(
+            message=lc_msg,
+            generation_info={
+                "finish_reason": "stop",
+                **response_payload.get("body", {}),
+            },
+        )
+        generations.append(gen)
+        token_usage = response_payload.get("usage", {})
+        llm_output = {"token_usage": token_usage, "model_name": self.model}
+        return ChatResult(generations=generations, llm_output=llm_output)
+
+    def _stream(
+            self,
+            messages: List[BaseMessage],
+            stop: Optional[List[str]] = None,
+            run_manager: Optional[CallbackManagerForLLMRun] = None,
+            **kwargs: Any,
+    ) -> Iterator[ChatGenerationChunk]:
+        """Call out to an qianfan models endpoint for each generation with a prompt.
+              Args:
+                  messages: The messages to pass into the model.
+                  stop: Optional list of stop words to use when generating.
+              Returns:
+                  The string generated by the model.
+
+              Example:
+                  .. code-block:: python
+                      response = qianfan_model.invoke("Tell me a joke.")
+              """
+        params = self._convert_prompt_msg_params(messages, **kwargs)
+        params["stop"] = stop
+        params["stream"] = True
+        for res in self.llm.call(**params):
+            if res:
+                res = res.raw
+                msg = _convert_dict_to_message(res)
+                additional_kwargs = msg.additional_kwargs.get("function_call", {})
+                chunk = ChatGenerationChunk(
+                    text=res["result"],
+                    message=AIMessageChunk(
+                        content=msg.content,
+                        role="assistant",
+                        additional_kwargs=additional_kwargs,
+                    ),
+                    generation_info=msg.additional_kwargs,
+                )
+                if run_manager:
+                    run_manager.on_llm_new_token(chunk.text, chunk=chunk)
+                yield chunk
+
+    async def _astream(
+            self,
+            messages: List[BaseMessage],
+            stop: Optional[List[str]] = None,
+            run_manager: Optional[AsyncCallbackManagerForLLMRun] = None,
+            **kwargs: Any,
+    ) -> AsyncIterator[ChatGenerationChunk]:
+        params = self._convert_prompt_msg_params(messages, **kwargs)
+        params["stop"] = stop
+        params["stream"] = True
+        async for res in await self.llm.acall(**params):
+            res = res.raw
+            if res:
+                msg = _convert_dict_to_message(res)
+                additional_kwargs = msg.additional_kwargs.get("function_call", {})
+                chunk = ChatGenerationChunk(
+                    text=res["result"],
+                    message=AIMessageChunk(
+                        content=msg.content,
+                        role="assistant",
+                        additional_kwargs=additional_kwargs,
+                    ),
+                    generation_info=msg.additional_kwargs,
+                )
+                if run_manager:
+                    await run_manager.on_llm_new_token(chunk.text, chunk=chunk)
+                yield chunk
diff --git a/docs/guidebook/_picture/agent_universe_framework_resize.jpg b/docs/guidebook/_picture/agent_universe_framework_resize.jpg
index 4613f467..49b98171 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/en/0_index.md b/docs/guidebook/en/0_index.md
index 7f8fbe72..e42b9c39 100644
--- a/docs/guidebook/en/0_index.md
+++ b/docs/guidebook/en/0_index.md
@@ -14,9 +14,13 @@
 * 2.2 [Domain Components](2_2_Domain_Component_Principles.md)
   * 2.2.1 [Agent](2_2_1_Agent.md)
     * 2.2.1.1 [Create And Use](2_2_1_Agent_Create_And_Use.md)
-    * 2.2.1.2 [Related Domain Objects](2_2_1_Agents_Related_Domain_Objects.md)
-  * 2.2.2 LLM
-  * 2.2.3 Tool
+    * 2.2.1.2 [Related Domain Objects](2_2_1_Agent_Related_Domain_Objects.md)
+  * 2.2.2 [LLM](2_2_2_LLM.md)
+    * 2.2.2.1 [Define And Use](2_2_2_LLM_component_define_and_usage.md)
+    * 2.2.2.2 [Related Domain Objects](2_2_2_LLM_Related_Domain_Objects.md)
+  * 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
@@ -35,12 +39,17 @@
 
 **3. Component Reference Manual**
 * 3.1 Domain Components
-  * 3.1.1 Agent
-  * 3.1.2 LLM
-  * 3.1.3 Tool
-  * 3.1.4 Knowledge
-  * 3.1.5 Memory
-  * 3.1.6 Planner
+  * 3.1.1 List of Agents
+  * 3.1.2 List of LLMs
+    * 3.1.2.1 [OpenAI Usage Instructions](3_1_2_OpenAI_LLM_Use.md)
+    * 3.1.2.2 [Qwen Usage Instructions](3_1_2_Qwen_LLM_Use.md)
+    * 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.3 List of Tools
+  * 3.1.4 List of Knowledge
+  * 3.1.5 List of Memories
+  * 3.1.6 List of Planners
 * 3.2 Technical Components
   * 3.2.1 RPC
     * 3.2.1.1 [gRPC](3_2_1_gRPC.md)
diff --git a/docs/guidebook/en/1_4_Application_Engineering_Structure_Explanation.md b/docs/guidebook/en/1_4_Application_Engineering_Structure_Explanation.md
index 6c1884d1..07541951 100644
--- a/docs/guidebook/en/1_4_Application_Engineering_Structure_Explanation.md
+++ b/docs/guidebook/en/1_4_Application_Engineering_Structure_Explanation.md
@@ -44,7 +44,7 @@ The specific meanings of each package directory level are as follows:
 ## Using Any Project Directory Structure
 You can adjust the project directory structure according to your preferences and actual circumstances, but please be sure to follow the rules below.
 
-### Bootstrap Startup Directory {#bootstrap-startup-directory}
+### Bootstrap Startup Directory
 Regardless of the location of your project's startup script, except for testing, please ensure that the application service is started with the following statement:
 
 ```python
diff --git a/docs/guidebook/en/2_2_1_Agent_Create_And_Use.md b/docs/guidebook/en/2_2_1_Agent_Create_And_Use.md
index 8563cc2e..9bfc764f 100644
--- a/docs/guidebook/en/2_2_1_Agent_Create_And_Use.md
+++ b/docs/guidebook/en/2_2_1_Agent_Create_And_Use.md
@@ -24,7 +24,7 @@ We will provide detailed descriptions of each component in the configuration.
   * `name`: name of LLM
   * `model_name`: model_name of LLM
 
-  You can choose any existing LLM or connect to any LLM of your choice. We will not elaborate on this part here; you can refer to the LLM section for more details.
+  You can choose any existing LLM or connect to any LLM of your choice. We will not elaborate on this part here; you can refer to the [LLM section](2_2_2_LLM.md) for more details.
 
 ### Setting the agent's plan
 **`plan` - plan of agent**
@@ -41,7 +41,7 @@ We will provide detailed descriptions of each component in the configuration.
     \- tool_name_b  
     \- tool_name_c  
 
-  You can choose any existing Tool or connect to any Tool of your choice. We will not elaborate on this part here; you can refer to the Tool section for more details.
+  You can choose any existing Tool or connect to any Tool of your choice. We will not elaborate on this part here; you can refer to the [Tool section](2_2_3_Tool.md) for more details.
 
 * `Knowledge` : Knowledge available for the agent's use.
   * knowledge_name_list，list of knowledge names, for example:   
@@ -104,13 +104,13 @@ metadata:
   module: 'sample_standard_app.app.core.agent.rag_agent_case.demo_rag_agent'
   class: 'DemoRagAgent'
 ```
-The above is an actual example of an agent configuration. In addition to the standard configuration items introduced above, the observant among you may have noticed variables in the prompt like `{background}` and `{input}`. This is a very practical prompt replacement feature, which we will explain in the section on defining behaviors in the agent domain.
+The above is an actual example of an agent configuration. In addition to the standard configuration items introduced above, the observant among you may have noticed variables in the prompt like `{background}` and `{input}`. This is a very practical prompt replacement feature, which we will explain in the section [How to dynamically adjust settings based on user input](#How to dynamically adjust settings based on user input).
 
 You can find more agent configuration YAML examples in our sample project under the path `sample_standard_app.app.core.agent`.
 
 In addition to this, agentUniverse does not restrict users from extending the YAML configuration content for agents. You can create any custom configuration key according to your own requirements, but please be careful not to duplicate the default configuration keywords mentioned above.
 
-## Creating Agent Domain Behavior Definition - agent_xx.py
+## Creating Agent Domain Behavior Definition agent_xx.py
 In this section, you can orchestrate and customize the behavior of any agent. Of course, if you are completely using existing Agent capabilities, this section is not mandatory.
 
 In this section, we will focus on commonly used definitions of agent domain behavior and the common techniques you may use in the actual process of defining agent domain behaviors.
@@ -156,7 +156,7 @@ The output processing node before agent execution, where an agent's output can b
 
 This section has one input parameter, as follows:
 * `agent_result`: Agent output data, of type `dict`.  
-`parse_result`方法的输出对象一般使用`agent_result`
+* The output object for the `parse_result` method is typically used `agent_result`.
 
 #### execute method
 This method is the core entry point for the agent's execution flow. The agent's base class implements the execution method by default, and users can also override this method to customize the execution method for any agent.
@@ -213,8 +213,36 @@ In this example, the `plan` section from the agent configuration attributes is a
 
 The properties and domain behaviors of the agent are both dependent on the Agent base class in the agentUniverse framework, which is located at `agentuniverse.agent.agent.Agent`. We will also focus on the underlying objects in the sections on agents and related domain objects. If you are interested in the underlying technical implementation, you can further refer to the corresponding code and documentation.
 
+#### An actual example of an agent domain behavior definition.
+```python
+from agentuniverse.agent.agent import Agent
+from agentuniverse.agent.input_object import InputObject
+from agentuniverse.agent.plan.planner.planner import Planner
+from agentuniverse.agent.plan.planner.planner_manager import PlannerManager
+
+class DemoRagAgent(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
+
+    # def execute(self, input_object: InputObject, agent_input: dict) -> dict:    
+    #     planner_base: Planner = PlannerManager().get_instance_obj(self.agent_model.plan.get('planner').get('name'))
+    #     planner_result = planner_base.invoke(self.agent_model, agent_input, input_object)
+    #     return planner_result
+```
+The above is an actual example of an agent domain behavior definition.
+
 ## Pay attention to the package path where your defined agent is located
-With the agent configuration and domain definition outlined above, you now have mastered all the steps to create an agent. Moving forward, we will use these agents, but before doing so, please ensure that the created agents are within the correct package scan path.
+With the above agent configuration and domain definition part, you have mastered all the steps to create an agent; next, we will use these agents. Before using, please ensure that the created agents are within the correct package scanning path.
 
 In the `config.toml` of the agentUniverse project, you need to configure the package corresponding to the agent file. Please confirm again that the package path where your created file is located is under the `CORE_PACKAGE` in the `agent` path or its subpaths.
 
@@ -226,15 +254,15 @@ Taking the configuration of the example project as a reference, it would be as f
 agent = ['sample_standard_app.app.core.agent']
 ```
 
-## Practical tips for agent development
+## Other techniques for agent development
 ### Customize and orchestrate the execution process of agents freely
-In the 'Creating Agent Domain Behavior Definitions' section of this document, we have already detailed how to customize an execute method. This method is often used in practice customizing processes and inject SOPs (Standard Operating Procedures) according to user demands.
+In the [Creating Agent Domain Behavior Definitions](#Creating Agent Domain Behavior Definition-agent_xx.py) section of this document, we have already detailed how to customize an execute method. This method is often used in practice customizing processes and inject SOPs (Standard Operating Procedures) according to user demands.
 
 ### How to dynamically adjust settings based on user input
 
 **Method 1 (Recommended): Through the standard prompt template variable replacement method.**  
 
-In the "A Practical Example of an Agent Configuration" section of this document, the prompt includes variables like `{background}`,`{input}`, etc. This feature is the prompt variable template replacement function, aimed at dynamically influencing the prompt based on the user's input. One only needs to define the text using `{variable}` format in the agent configuration settings section, and define it in the parse_input's `agent_input` to dynamically replace the corresponding prompt based on the input portion.
+In [An actual example of an agent configuration](#An actual example of an agent configuration.) section of this document, the prompt includes variables like `{background}`,`{input}`, etc. This feature is the prompt variable template replacement function, aimed at dynamically influencing the prompt based on the user's input. One only needs to define the text using `{variable}` format in the agent configuration settings section, and define it in the parse_input's `agent_input` to dynamically replace the corresponding prompt based on the input portion.
 
 For example, in the sample agent `sample_standard_app.app.core.agent.rag_agent_case.demo_rag_agent.py`, there is the following `parse_input` method.
 
@@ -335,7 +363,7 @@ metadata:
   class: 'RagAgent'
 ```
 
-You can find more information about existing agents and understand their roles in the "Learn More About Existing Agents" section of this document.
+You can find more information about existing agents and understand their roles in the [Learn more about agents](#Learn more about agents) section of this document.
 
 # How to Use an Agent
 In the agentUniverse, all agent entities are managed by a global agent manager. If you need to use an agent during any framework execution process, you can do so through the agent manager. Additionally, leveraging the framework's service capabilities, you can quickly turn an agent into a service and make network calls to it using standard HTTP or RPC protocols.
diff --git a/docs/guidebook/en/2_2_1_Agents_Related_Domain_Objects.md b/docs/guidebook/en/2_2_1_Agent_Related_Domain_Objects.md
similarity index 61%
rename from docs/guidebook/en/2_2_1_Agents_Related_Domain_Objects.md
rename to docs/guidebook/en/2_2_1_Agent_Related_Domain_Objects.md
index 0e6af2e0..60f3aeae 100644
--- a/docs/guidebook/en/2_2_1_Agents_Related_Domain_Objects.md
+++ b/docs/guidebook/en/2_2_1_Agent_Related_Domain_Objects.md
@@ -1,5 +1,5 @@
-# Agents and Related Domain Objects
-In this chapter, we will highlight agents and related core domain objects. We have omitted their corresponding code parts. If you wish to learn more, please read the [API Reference](4_1_API_Reference.md) Section.
+# Agent and Related Domain Objects
+In this chapter, we will highlight agent and related core domain objects. We have omitted their corresponding code parts. If you wish to learn more, please read the [API Reference](4_1_API_Reference.md) Section.
 
 ## Agent Base Class
 Package path: `agentuniverse.agent.agent.Agent`
diff --git a/docs/guidebook/en/2_2_2_LLM.md b/docs/guidebook/en/2_2_2_LLM.md
new file mode 100644
index 00000000..e3254f4a
--- /dev/null
+++ b/docs/guidebook/en/2_2_2_LLM.md
@@ -0,0 +1,11 @@
+# LLM
+LLM - Large Language Model. LLMs possess formidable capabilities for text generation and comprehension; they can understand natural language and communicate with humans using it. They are the most critical modules for agents to have learning, reasoning, decision-making, and execution capabilities, often likened to the brain of the agent. They are the intellectual core of the agent.
+
+Currently, well-known companies such as OpenAI, Google, Anthropic, Meta, Alibaba, and Baidu all offer their own large model services. At the same time, individuals or businesses can also customize their own various LLMs using public model training and fine-tuning schemes. On model sharing platforms like HuggingFace, you can find a vast array of LLMs.
+
+The LLM model component of agentUniverse can help you quickly access various common LLM services on the market through simple configuration. Meanwhile, the standard LLM model definition also supports your customization to access any public model service, private model service, or locally deployed model.
+
+Different LLMs possess varying capabilities; some excel in certain evaluative dimensions, some are suited for specialized domain tasks, and others can handle multimodal tasks such as images and audio. These introduced LLM capabilities can serve as core components of an Agent, and they can also be used in any other components, such as tools. This means that you can integrate the most suitable model for your agent's use and, during multi-agent collaboration, different agents can employ different models.
+
+# Conclusion
+At this point, you have a basic understanding of the design principles of the LLM component. In the next section, we will specifically introduce you to the standard definition of the LLM component, how to custom integrate an LLM, and how to use the LLM component, etc.
\ No newline at end of file
diff --git a/docs/guidebook/en/2_2_2_LLM_Related_Domain_Objects.md b/docs/guidebook/en/2_2_2_LLM_Related_Domain_Objects.md
new file mode 100644
index 00000000..1627b449
--- /dev/null
+++ b/docs/guidebook/en/2_2_2_LLM_Related_Domain_Objects.md
@@ -0,0 +1,11 @@
+# LLM and Related Domain Objects
+In this chapter, we will highlight LLM and related core domain objects. We have omitted their corresponding code parts. If you wish to learn more, please read the [API Reference](4_1_API_Reference.md) Section.
+
+## LLM Base Class
+Package path: `agentuniverse.llm.llm.LLM`
+
+## LLM Manager
+Package path: `agentuniverse.llm.llm_manager.LLMManager`
+
+## Output Object
+Package path:`agentuniverse.llm.llm_output.LLMOutput`
diff --git a/docs/guidebook/en/2_2_2_LLM_component_define_and_usage.md b/docs/guidebook/en/2_2_2_LLM_component_define_and_usage.md
new file mode 100644
index 00000000..1d2f76b9
--- /dev/null
+++ b/docs/guidebook/en/2_2_2_LLM_component_define_and_usage.md
@@ -0,0 +1,506 @@
+# How to definite LLMs
+Based on the design characteristics of the domain components of agentUniverse, creating a model LLM definition consists of two parts:
+
+* llm_xx.yaml
+* llm_xx.py 
+
+The `llm_xx.yaml` must be created; it includes important property information such as the LLM component's name, description, and model name. The `llm_xx.py` is created as needed and contains the specific behavior of the LLM component, supporting user-standard behavior customization injection for the LLM. Understanding this principle, let's look at how to create these two parts in detail.
+
+## Creating LLM Configuration llm_xx.yaml
+We will detail the various components within the configuration.
+
+### Setting the basic attributes of the LLM.
+* `name`: The name of the LLM, the name of the LLM instance. You can set any name as per your preference.
+* `description`: Description of the LLM, fill in according to your actual needs.
+* `model_name`: The official name of the accessed LLM model, such as `gpt-4o`, `gpt-3.5-turbo` etc., from the OpenAI series.
+* `max_retries`: The maximum number of retries for accessing the LLM.
+* `max_tokens`: The maximum number of tokens that the LLM model instance supports. This attribute must be less than the maximum number of tokens that the official model_name can handle.
+
+### Setting LLM Component Metadata
+**`metadata` - metadata of component**
+* `type`: The component type, 'LLM'
+* `module`: Path to the LLM entity package
+* `class`: Name of the LLM entity class
+
+All the provided LLM components will include the corresponding `module` and `class` information, which can be copied directly into this section. This part integrates all the configuration of the LLM component with its behavior to form a complete unit. If you have defined standard behavior for the LLM, then you will need to fill in this section according to the actual path. We will provide further explanation in the subsequent section on [Creating from Existing LLMs Object](#Creating from Existing LLMs Object).
+
+### An actual example of an LLM configuration definition.
+```yaml
+name: 'demo_llm'
+description: 'demo openai'
+model_name: 'gpt-3.5-turbo'
+max_tokens: 1000
+max_retries: 2
+metadata:
+  type: 'LLM'
+  module: 'agentuniverse.llm.default.default_openai_llm'
+  class: 'DefaultOpenAILLM'
+```
+
+The above is an actual example of an LLM configuration. In addition to the standard configuration items introduced above, you can find more examples of LLM configuration YAMLs in our sample project under the path `sample_standard_app.app.core.llm`.
+
+Furthermore, agentuniverse does not restrict users from extending the LLM YAML configuration content. You can create any custom configuration keys according to your requirements, but please be careful not to duplicate the default configuration keywords mentioned above.
+
+## Creating LLM Domain Behavior Definition - llm_xx.py
+In this section, you can extend the behavior of any LLM; however, this part is not necessary if you are completely using the existing LLM capabilities.
+
+In this section, we will focus on introducing the common behavior definitions of LLMs and the techniques that you might use in the actual LLM behavior definition process.
+
+### Creating an LLM class object
+Create the corresponding LLM class object and inherit from the `LLM` base class of the agentUniverse framework.
+
+### Customizing the Corresponding LLM Domain Behavior
+Common customizable LLM behaviors are as follows.
+
+#### _new_client method
+We know that many model services have provided standard client SDKs. In this method, you can inject the official client provided by the LLM service. If the model you are using does not offer a standard client, this step is not necessary.
+
+```python
+def _new_client(self):
+        """Initialize the client."""
+        pass
+```
+
+#### _new_async_client method
+Similar to the `_new_client` method, in this method, you can inject the official asynchronous client provided by the LLM service. If the model you are using does not offer a standard asynchronous client, this step is not necessary.
+
+```python
+def _new_async_client(self):
+        """Initialize the async client."""
+        pass
+```
+
+#### The call and acall methods
+The LLM base class provides two abstract methods: call (for synchronous calling) and acall (for asynchronous calling). Users can customize the model invocation by implementing the call and acall methods.
+Their standard definitions are as follows:
+```python
+from abc import abstractmethod
+from typing import Optional, Any, AsyncIterator, Iterator, Union
+from agentuniverse.llm.llm_output import LLMOutput
+
+@abstractmethod
+def call(self, *args: Any, **kwargs: Any) -> Union[LLMOutput, Iterator[LLMOutput]]:
+    """Run the LLM."""
+
+@abstractmethod
+async def acall(self, *args: Any, **kwargs: Any) -> Union[LLMOutput, AsyncIterator[LLMOutput]]:
+    """Asynchronously run the LLM."""
+```
+
+#### The as_langchain method
+agentUniverse utilizes the capabilities of langchain at a lower level. It is compatible with the LLM definition methods used by langchain. If your project has already been using langchain, then all you need to do in this method is to incorporate the BaseLanguageModel, which is a fundamental model from the Langchain framework, to merge agentUniverse with langchain. agentUniverse can support integration with any similar orchestration framework, such as Semantic Kernel, though currently, our focus is on langchain.
+
+```python
+from langchain_core.language_models.base import BaseLanguageModel
+
+def as_langchain(self) -> BaseLanguageModel:
+        """Convert to the langchain llm class."""
+        pass
+```
+
+#### The max_context_length method
+This method defines the maximum context length for an LLM model. For example, the max_context_length method returns 8192 for GPT-4 and 4096 for GPT-3.5-turbo. This information can be found in the model's official documentation.
+
+#### The get_num_tokens method
+The get_num_tokens method defines the model's encoding method and the way tokens are counted. It takes the input data and outputs the corresponding number of tokens.
+
+#### An Actual Example of LLM Domain Behavior Definition
+Taking the OpenAI LLM series as an example, let's consider OpenAILLM.py.
+
+```python
+from typing import Any, Optional, AsyncIterator, Iterator, Union
+
+import httpx
+from langchain_core.language_models.base import BaseLanguageModel
+from openai import OpenAI, AsyncOpenAI
+from pydantic import Field
+import tiktoken
+
+from agentuniverse.llm.langchain_instance import LangchainOpenAI
+from agentuniverse.llm.llm import LLM, LLMOutput
+from agentuniverse.base.util.env_util import get_from_env
+
+OPENAI_MAX_CONTEXT_LENGTH = {
+    "gpt-3.5-turbo": 4096,
+    "gpt-3.5-turbo-0301": 4096,
+    "gpt-3.5-turbo-0613": 4096,
+    "gpt-3.5-turbo-16k": 16384,
+    "gpt-3.5-turbo-16k-0613": 16384,
+    "gpt-35-turbo": 4096,
+    "gpt-35-turbo-16k": 16384,
+    "gpt-3.5-turbo-1106": 16384,
+    "gpt-3.5-turbo-0125": 16384,
+    "gpt-4-0314": 8192,
+    "gpt-4": 8192,
+    "gpt-4-32k": 32768,
+    "gpt-4-32k-0613": 32768,
+    "gpt-4-0613": 8192,
+    "gpt-4-1106-preview": 128000,
+    "gpt-4-turbo": 128000,
+    "gpt-4o": 128000,
+    "gpt-4o-2024-05-13": 128000,
+}
+
+
+class OpenAILLM(LLM):
+    """The openai llm class.
+
+    Attributes:
+        openai_api_key (Optional[str], optional): The API key for the OpenAI API.
+        This automatically infers the `openai_api_key` from the environment variable `OPENAI_API_KEY` if not provided.
+
+        openai_organization (Optional[str], optional): The OpenAI organization.
+        This automatically infers the `openai_organization` from the environment variable `OPENAI_ORGANIZATION` if not provided.
+
+        openai_api_base (Optional[str], optional): The OpenAI base url.
+        This automatically infers the `openai_api_base` from the environment variable `OPENAI_API_BASE` if not provided.
+
+        openai_client_args (Optional[dict], optional): Additional arguments to pass to the OpenAI client.
+   """
+
+    openai_api_key: Optional[str] = Field(default_factory=lambda: get_from_env("OPENAI_API_KEY"))
+    openai_organization: Optional[str] = Field(default_factory=lambda: get_from_env("OPENAI_ORGANIZATION"))
+    openai_api_base: Optional[str] = Field(default_factory=lambda: get_from_env("OPENAI_API_BASE"))
+    openai_proxy: Optional[str] = Field(default_factory=lambda: get_from_env("OPENAI_PROXY"))
+    openai_client_args: Optional[dict] = None
+
+    def _new_client(self):
+        """Initialize the openai client."""
+        return OpenAI(
+            api_key=self.openai_api_key,
+            organization=self.openai_organization,
+            base_url=self.openai_api_base,
+            timeout=self.request_timeout,
+            max_retries=self.max_retries,
+            http_client=httpx.Client(proxy=self.openai_proxy) if self.openai_proxy else None,
+            **(self.openai_client_args or {}),
+        )
+
+    def _new_async_client(self):
+        """Initialize the openai async client."""
+        return AsyncOpenAI(
+            api_key=self.openai_api_key,
+            organization=self.openai_organization,
+            base_url=self.openai_api_base,
+            timeout=self.request_timeout,
+            max_retries=self.max_retries,
+            http_client=httpx.AsyncClient(proxy=self.openai_proxy) if self.openai_proxy else None,
+            **(self.openai_client_args or {}),
+        )
+
+    def call(self, messages: list, **kwargs: Any) -> Union[LLMOutput, Iterator[LLMOutput]]:
+        """Run the OpenAI LLM.
+
+        Args:
+            messages (list): The messages to send to the LLM.
+            **kwargs: Arbitrary keyword arguments.
+        """
+        streaming = kwargs.pop("streaming") if "streaming" in kwargs else self.streaming
+        self.client = self._new_client()
+        with self.client as client:
+            chat_completion = client.chat.completions.create(
+                messages=messages,
+                model=kwargs.pop('model', self.model_name),
+                temperature=kwargs.pop('temperature', self.temperature),
+                stream=kwargs.pop('stream', streaming),
+                max_tokens=kwargs.pop('max_tokens', self.max_tokens),
+                **kwargs,
+            )
+            if not streaming:
+                text = chat_completion.choices[0].message.content
+                return LLMOutput(text=text, raw=chat_completion.model_dump())
+            return self.generate_stream_result(chat_completion)
+
+    async def acall(self, messages: list, **kwargs: Any) -> Union[LLMOutput, AsyncIterator[LLMOutput]]:
+        """Asynchronously run the OpenAI LLM.
+
+        Args:
+            messages (list): The messages to send to the LLM.
+            **kwargs: Arbitrary keyword arguments.
+        """
+        streaming = kwargs.pop("streaming") if "streaming" in kwargs else self.streaming
+        self.async_client = self._new_async_client()
+        async with self.async_client as async_client:
+            chat_completion = await async_client.chat.completions.create(
+                messages=messages,
+                model=kwargs.pop('model', self.model_name),
+                temperature=kwargs.pop('temperature', self.temperature),
+                stream=kwargs.pop('stream', streaming),
+                max_tokens=kwargs.pop('max_tokens', self.max_tokens),
+                **kwargs,
+            )
+            if not streaming:
+                text = chat_completion.choices[0].message.content
+                return LLMOutput(text=text, raw=chat_completion.model_dump())
+            return self.agenerate_stream_result(chat_completion)
+
+    def as_langchain(self) -> BaseLanguageModel:
+        """Convert the AgentUniverse(AU) openai llm class to the langchain openai llm class."""
+        return LangchainOpenAI(self)
+
+    def max_context_length(self) -> int:
+        """Max context length.
+
+          The total length of input tokens and generated tokens is limited by the openai model's context length.
+          """
+        return OPENAI_MAX_CONTEXT_LENGTH.get(self.model_name, 4096)
+
+    def get_num_tokens(self, text: str) -> int:
+        """Get the number of tokens present in the text.
+
+        Useful for checking if an input will fit in an openai model's context window.
+
+        Args:
+            text: The string input to tokenize.
+
+        Returns:
+            The integer number of tokens in the text.
+        """
+        try:
+            encoding = tiktoken.encoding_for_model(self.model_name)
+        except KeyError:
+            encoding = tiktoken.get_encoding("cl100k_base")
+        return len(encoding.encode(text))
+
+    @staticmethod
+    def parse_result(chunk):
+        """Generate the result of the stream."""
+        chat_completion = chunk
+        if not isinstance(chunk, dict):
+            chunk = chunk.dict()
+        if len(chunk["choices"]) == 0:
+            return
+        choice = chunk["choices"][0]
+        message = choice.get("delta")
+        text = message.get("content")
+        if not text:
+            return
+        return LLMOutput(text=text, raw=chat_completion.model_dump())
+
+    @classmethod
+    def generate_stream_result(cls, stream: Iterator) -> Iterator[LLMOutput]:
+        """Generate the result of the stream."""
+        for chunk in stream:
+            llm_output = cls.parse_result(chunk)
+            if llm_output:
+                yield llm_output
+
+    @classmethod
+    async def agenerate_stream_result(cls, stream: AsyncIterator) -> AsyncIterator[LLMOutput]:
+        """Generate the result of the stream."""
+        async for chunk in stream:
+            llm_output = cls.parse_result(chunk)
+            if llm_output:
+                yield llm_output
+```
+In the aforementioned example, we connect to the standard OpenAI client SDK through the `_new_client` and `_new_async_client` methods. The implementation of `call` and `acall` accomplishes the standard synchronous and asynchronous invocation methods of OpenAI. By introducing the LangchainOpenAI object in `as_langchain`, we complete the integration with the langchain framework.
+
+LangchainOpenAI.py is an object of the BaseLanguageModel from langchain. You can refer to the following example.
+
+```python
+from typing import Any, List, Optional, AsyncIterator
+
+from langchain.callbacks.manager import AsyncCallbackManagerForLLMRun, CallbackManagerForLLMRun
+from langchain.chat_models import ChatOpenAI
+from langchain.schema import BaseMessage, ChatResult
+from langchain_community.chat_models.openai import _convert_delta_to_message_chunk
+from langchain_core.language_models.chat_models import generate_from_stream, agenerate_from_stream
+from langchain_core.messages import AIMessageChunk
+from langchain_core.outputs import ChatGenerationChunk
+
+from agentuniverse.llm.llm import LLM
+
+
+class LangchainOpenAI(ChatOpenAI):
+    """Langchain OpenAI LLM wrapper."""
+
+    llm: Optional[LLM] = None
+
+    def __init__(self, llm: LLM):
+        """The __init__ method.
+
+        The agentUniverse LLM instance is passed to this class as an argument.
+        Convert the attributes of AgentUniverse(AU) LLM instance to the LangchainOpenAI object for initialization
+
+        Args:
+            llm (LLM): the AgentUniverse(AU) LLM instance.
+        """
+        init_params = dict()
+        init_params['model_name'] = llm.model_name if llm.model_name else 'gpt-3.5-turbo'
+        init_params['temperature'] = llm.temperature if llm.temperature else 0.7
+        init_params['request_timeout'] = llm.request_timeout
+        init_params['max_tokens'] = llm.max_tokens
+        init_params['max_retries'] = llm.max_retries if llm.max_retries else 2
+        init_params['streaming'] = llm.streaming if llm.streaming else False
+        init_params['openai_api_key'] = llm.openai_api_key if llm.openai_api_key else 'blank'
+        init_params['openai_organization'] = llm.openai_organization
+        init_params['openai_api_base'] = llm.openai_api_base
+        init_params['openai_proxy'] = llm.openai_proxy
+        super().__init__(**init_params)
+        self.llm = llm
+
+    def _generate(
+            self,
+            messages: List[BaseMessage],
+            stop: Optional[List[str]] = None,
+            run_manager: Optional[CallbackManagerForLLMRun] = None,
+            stream: Optional[bool] = None,
+            **kwargs,
+    ) -> ChatResult:
+        """Run the Langchain OpenAI LLM."""
+        should_stream = stream if stream is not None else self.streaming
+        message_dicts, params = self._create_message_dicts(messages, stop)
+        params = {**params, **kwargs}
+        llm_output = self.llm.call(messages=message_dicts, **params)
+        if not should_stream:
+            return self._create_chat_result(llm_output.raw)
+        stream_iter = self.as_langchain_chunk(llm_output)
+        return generate_from_stream(stream_iter)
+
+    async def _agenerate(
+            self,
+            messages: List[BaseMessage],
+            stop: Optional[List[str]] = None,
+            run_manager: Optional[AsyncCallbackManagerForLLMRun] = None,
+            stream: Optional[bool] = None,
+            **kwargs: Any,
+    ) -> ChatResult:
+        """Asynchronously run the Langchain OpenAI LLM."""
+        should_stream = stream if stream is not None else self.streaming
+        message_dicts, params = self._create_message_dicts(messages, stop)
+        params = {**params, **kwargs}
+        llm_output = await self.llm.acall(messages=message_dicts, **params)
+        if not should_stream:
+            return self._create_chat_result(llm_output.raw)
+        stream_iter = self.as_langchain_achunk(llm_output)
+        return await agenerate_from_stream(stream_iter)
+
+    @staticmethod
+    def as_langchain_chunk(stream, run_manager=None):
+        default_chunk_class = AIMessageChunk
+        for llm_result in stream:
+            chunk = llm_result.raw
+            if not isinstance(chunk, dict):
+                chunk = chunk.dict()
+            if len(chunk["choices"]) == 0:
+                continue
+            choice = chunk["choices"][0]
+            chunk = _convert_delta_to_message_chunk(
+                choice["delta"], default_chunk_class
+            )
+            finish_reason = choice.get("finish_reason")
+            generation_info = (
+                dict(finish_reason=finish_reason) if finish_reason is not None else None
+            )
+            default_chunk_class = chunk.__class__
+            chunk = ChatGenerationChunk(message=chunk, generation_info=generation_info)
+            yield chunk
+            if run_manager:
+                run_manager.on_llm_new_token(chunk.text, chunk=chunk)
+
+    @staticmethod
+    async def as_langchain_achunk(stream_iterator: AsyncIterator, run_manager=None) \
+            -> AsyncIterator[ChatGenerationChunk]:
+        default_chunk_class = AIMessageChunk
+        async for llm_result in stream_iterator:
+            chunk = llm_result.raw
+            if not isinstance(chunk, dict):
+                chunk = chunk.dict()
+            if len(chunk["choices"]) == 0:
+                continue
+            choice = chunk["choices"][0]
+            chunk = _convert_delta_to_message_chunk(
+                choice["delta"], default_chunk_class
+            )
+            finish_reason = choice.get("finish_reason")
+            generation_info = (
+                dict(finish_reason=finish_reason) if finish_reason is not None else None
+            )
+            default_chunk_class = chunk.__class__
+            chunk = ChatGenerationChunk(message=chunk, generation_info=generation_info)
+            yield chunk
+            if run_manager:
+                await run_manager.on_llm_new_token(token=chunk.text, chunk=chunk)
+```
+
+Within the integration object of agentUniverse and langchain, you only need to refactor the `_generate` and `_agenerate` methods of the langchain's LLM model. The focus here is on utilizing the `self.llm.call` and `self.llm.acall` methods. Other aspects will be mentioned in the practical tips section later on and will not be elaborated here.
+
+## Pay attention to the package path where your defined LLM is located.
+
+With the above configuration and domain definition of LLM, you have mastered all the steps of creating an LLM definition. Next, we will use these LLMs, but before using them, please ensure that the created LLM is within the correct package scan path.
+
+In the config.toml of the agentUniverse project, you need to configure the package corresponding to the LLM file. Please confirm again whether the package path where your created file is located is under the `CORE_PACKAGE` 's `llm` path or its subpath.
+
+Here is an example configuration from the sample project, as follows:
+
+```yaml
+[CORE_PACKAGE]
+# Scan and register llm components for all paths under this list, with priority over the default.
+llm = ['sample_standard_app.app.core.llm']
+```
+
+## Pay attention to the API key associated with the LLM you are using.
+
+The basic parameters of the API key for the model, such as openai_api_key, openai_organization, openai_base, openai_proxy, etc., can be configured as system environment variables. The model object will read the corresponding system environment variables during the initialization process to assemble the parameters. In addition, you can also configure secret keys and other information in the custom_key.toml of agentUniverse (we recommend that you place such configurations outside the project or exclude them from tracking in .gitignore to avoid key information being tracked by git and leaked). During the initialization process of the agentUniverse system, it will automatically read the configuration file and register the configuration information to the system environment variables.
+
+Below is an actual configuration of `custom_key.toml`:
+```toml
+# Example file of custom_key.toml. Rename to custom_key.toml while using.
+[KEY_LIST]
+# Perform a full component scan and registration for all the paths under this list.
+SERPER_API_KEY='xxx'
+OPENAI_API_KEY='xxx'
+```
+
+## Other Tips for Creating LLM Model Components
+### Adding LLM Streaming Capabilities
+In the example provided in [Customizing the Corresponding LLM Domain Behavior](#An Actual Example of LLM Domain Behavior Definition), streaming capabilities have already been outlined. You can focus on the methods `generate_stream_result` and `agenerate_stream_result` within `call` and `acall`.
+
+If you are using the Langchain-related LLM class and need to implement streaming return in `_generate` and `_agenerate`, you should pay particular attention to the methods `as_langchain_chunk` and `as_langchain_achunk` in the example LangchainOpenAI.py.
+
+### Creating from Existing LLMs Object
+agentUniverse allows for the quick creation of LLM instances from existing LLM component objects.
+
+For example, the OpenAI LLM series is provided by the framework, and its standard metadata is as follows:
+```text
+module: 'agentuniverse.llm.default.default_openai_llm'
+class: 'DefaultOpenAILLM'
+```
+
+If we need to configure and define an LLM instance based on the `gpt-3.5-turbo model`, with a maximum token limit of 1000 and a retry count of 2 for failures, the configuration would be as follows:
+```yaml
+name: 'demo_llm'
+description: 'demo openai'
+model_name: 'gpt-3.5-turbo'
+max_tokens: 1000
+max_retries: 2
+metadata:
+  type: 'LLM'
+  module: 'agentuniverse.llm.default.default_openai_llm'
+  class: 'DefaultOpenAILLM'
+```
+
+You can find more LLM metadata in the [Understanding More Existing LLM Components](#Understanding More Existing LLM Components) section of this document.
+
+# How to Use Model LLM Components
+## Configure for use in an Agent
+You can set up any LLM you have created in the llm_model 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_multillm_agent`, with the specific file path being `sample_standard_app/app/core/agent/rag_agent_case/demo_multillm_agent.yaml`.
+
+## Using the LLM Manager
+You can obtain an LLM instance with the specified name through the `.get_instance_obj(xx_llm_name)` method in the LLM Manager.
+
+```python
+from agentuniverse.llm.llm import LLM
+from agentuniverse.llm.llm_manager import LLMManager
+
+llm: LLM = LLMManager().get_instance_obj('llm_name')
+```
+
+# Understanding More Existing LLM Components
+The framework provides additional LLM components under the package path `agentuniverse.llm.default`. You can further inspect the corresponding code or learn more about them in our extended component introduction section.
+
+
+# Conclusion
+By now, you have mastered the definition and use of model LLMs. Go ahead and try defining and using LLMs.
\ No newline at end of file
diff --git a/docs/guidebook/en/2_2_3_Tool.md b/docs/guidebook/en/2_2_3_Tool.md
new file mode 100644
index 00000000..9a0b4455
--- /dev/null
+++ b/docs/guidebook/en/2_2_3_Tool.md
@@ -0,0 +1,9 @@
+# Tool
+Just as humans use and create tools to extend their capabilities, enhance their professionalism, and compensate for deficiencies in their innate abilities, intelligent agents can also leverage tools to push the boundaries of their capabilities. 
+
+In complex task scenarios, specialized tools are often needed to improve the performance of agents. These tools can be existing APIs or methods within the task domain or new methods created by users to solve problems.
+
+agentUniverse provides a standardized approach to customizing tools. Combining underlying RPC technological components with standard HTTP protocol, you can register any API or local code snippet as a standard tool for use by agents and other components.
+
+# Conclusion
+By now, you should have a basic understanding of the design principles behind tool components. In the next section, we will introduce you to the standard definitions of tool components, how to customize and create your own tools, and how to utilize these tools.
\ No newline at end of file
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
new file mode 100644
index 00000000..e25e0153
--- /dev/null
+++ b/docs/guidebook/en/2_2_3_Tool_Create_And_Use.md
@@ -0,0 +1,103 @@
+# How to Define a Tool Component
+In accordance with the design characteristics of agentUniverse domain components, like other components, creating a Tool definition consists of two parts:
+* tool_xx.yaml
+* tool_xx.py
+
+The `tool_xx.yaml` contains important attribute information about the Tool component such as its name, description, inputs, outputs, etc.; `tool_xx.py` includes the specific definition of the tool. Having understood this principle, let's take a closer look at how to create these two parts.
+
+## Creating Tool Configuration - tool_xx.yaml
+We will provide a detailed introduction to each component within the configuration.
+
+### Setting Basic Properties of the Tool
+* `name`:  The name of the tool, you can set any name you desire.
+* `description`:  A description of the tool, fill in according to your actual requirements.
+* `input_keys`: A `list` type, list of input parameters.
+
+### Setting Tool Component Metadata
+**`metadata` - metadata of component**
+* `type`: The component type, 'TOOL'
+* `module`: Path to the Tool entity package
+* `class`: Name of the Tool entity class
+
+### An actual example of a Tool definition configuration.
+```yaml
+name: 'google_search_tool'
+description: 'demo google search tool'
+input_keys: ['input']
+metadata:
+  type: 'TOOL'
+  module: 'xxx.tool.google_search_tool'
+  class: 'GoogleSearchTool'
+```
+
+The above is an actual example of a Tool configuration sample. 
+
+In addition to the standard configuration items introduced above, you can find more examples of tool configuration YAML files in the `sample_standard_app.app.core.tool` directory of our sample project.
+
+Moreover, agentUniverse does not restrict users from extending the Tool YAML configuration content. You can create any custom configuration keys according to your own requirements, but please be careful not to duplicate the names of the default configuration keywords mentioned above.
+
+## Creating Tool Domain Behavior Definition - tool_xx.py
+
+### Creating Tool Class Object
+Create the corresponding Tool class object and inherit from the agentUniverse framework base class `Tool`.
+
+### Writing the Tool Class Object's execute Method
+Write the actual logic snippet of the tool in the `execute` method.
+
+```text
+@abstractmethod
+def execute(self, tool_input: ToolInput):
+    raise NotImplementedError
+```
+
+#### 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
+
+class GoogleSearchTool(Tool):
+    """The demo google search tool.
+
+    Implement the execute method of demo google search tool, using the `GoogleSerperAPIWrapper` to implement a simple Google search.
+
+    Note:
+        You need to sign up for a free account at https://serper.dev and get the serpher api key (2500 free queries).
+    """
+
+    def execute(self, tool_input: ToolInput):
+        query = tool_input.get_data("input")
+        # get top3 results from Google search.
+        search = GoogleSerperAPIWrapper(serper_api_key='', k=3, type="search")
+        return search.run(query=query)
+```
+In this example, we integrated Google's search tool, which retrieves and returns the three most relevant pieces of content related to the search query.
+
+## Pay attention to the package path where your defined Tool is located.
+With the Tool configuration and definition covered above, you have mastered all the steps of creating tools. Next, we will use these Tools, but before using them, please ensure that the created Tool is within the correct package scan path.
+
+In the config.toml of the agentUniverse project, you need to configure the package corresponding to the Tool configuration. Please confirm again if the package path where your created file is located is under the `CORE_PACKAGE` in the `tool` path or its subpaths.
+
+Taking the configuration in the example project as an example, it is as follows.
+```yaml
+[CORE_PACKAGE]
+# Scan and register tool components for all paths under this list, with priority over the default.
+tool = ['sample_standard_app.app.core.tool']
+```
+
+# How to Use the Tool Component
+## 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.
+
+```python
+from agentuniverse.agent.action.tool.tool_manager import ToolManager
+
+tool = ToolManager().get_instance_obj('your_tool_name')
+tool_input = {'your_input_key': 'input_values'}
+tool.run(**tool_input)
+```
+
+# Learn More About Existing Tools
+More examples of tools provided by the framework can be found in the `sample_standard_app.app.core.tool` package path, where you can further explore the corresponding tools.
+
+# Conclusion
+By now, you have mastered the definition and usage of Tool components. Go ahead and try creating and using tools.
diff --git a/docs/guidebook/en/2_2_3_Tool_Related_Domain_Objects.md b/docs/guidebook/en/2_2_3_Tool_Related_Domain_Objects.md
new file mode 100644
index 00000000..23b83614
--- /dev/null
+++ b/docs/guidebook/en/2_2_3_Tool_Related_Domain_Objects.md
@@ -0,0 +1,11 @@
+# Tool and Related Domain Objects
+In this chapter, we will highlight tool and related core domain objects. We have omitted their corresponding code parts. If you wish to learn more, please read the [API Reference](4_1_API_Reference.md) Section.
+
+## Tool Base Class
+Package path: `agentuniverse.agent.action.tool.tool.Tool`
+
+## Tool Manager
+Package path: `agentuniverse.agent.action.tool.tool_manager.ToolManager`
+
+## Input Object
+Package path: `agentuniverse.agent.action.tool.tool.ToolInput`
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
new file mode 100644
index 00000000..5d5975eb
--- /dev/null
+++ b/docs/guidebook/en/3_1_2_0_List_Of_LLMs.md
@@ -0,0 +1,14 @@
+# List of LLMs
+The platform has currently integrated the following list of models; please refer to this section for detailed usage instructions for each LLM.
+
+| LLM (Series) Name                     |
+|---------------------------------------|
+| [OpenAI](3_1_2_OpenAI_LLM_Use.md)     |
+| [Qwen](3_1_2_Qwen_LLM_Use.md)         |
+| [WenXin](3_1_2_WenXin_LLM_Use.md)     |
+| [Kimi](3_1_2_Kimi_LLM_Use.md)         |
+| [BaiChuan](3_1_2_BaiChuan_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
diff --git a/docs/guidebook/en/3_1_2_BaiChuan_LLM_Use.md b/docs/guidebook/en/3_1_2_BaiChuan_LLM_Use.md
new file mode 100644
index 00000000..36e03873
--- /dev/null
+++ b/docs/guidebook/en/3_1_2_BaiChuan_LLM_Use.md
@@ -0,0 +1,36 @@
+# BaiChuan 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_baichuan_llm'
+description: 'user baichuan llm with spi'
+model_name: 'Baichuan2-Turbo'
+max_tokens: 1000
+max_context_length: The maximum length of context
+metadata:
+  type: 'LLM'
+  module: 'agentuniverse.llm.default.baichuan_openai_style_llm'
+  class: 'BAICHUANOpenAIStyleLLM'
+```
+## 2. Environment Setup
+### 2.1 Configure through Python code
+Must be configured: BAICHUAN_API_KEY  
+Optional: BAICHUAN_API_BASE, BAICHUAN_PROXY
+```python
+import os
+os.environ['BAICHUAN_API_KEY'] = 'sk-***'
+os.environ['BAICHUAN_PROXY'] = '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
+BAICHUAN_API_KEY="sk-******"
+BAICHUAN_PROXY="https://xxxxxx"
+```
+## 3. Obtaining the BAICHUAN API KEY
+Reference BaiChuan Official Documentation: https://platform.baichuan-ai.com/console/apikey
+
+## 4. Tips
+In agentuniverse, we have already created an llm with the name default_baichuan_llm. After configuring the BAICHUAN_API_KEY, users can directly use it.
+
diff --git a/docs/guidebook/en/3_1_2_Kimi_LLM_Use.md b/docs/guidebook/en/3_1_2_Kimi_LLM_Use.md
new file mode 100644
index 00000000..775e5999
--- /dev/null
+++ b/docs/guidebook/en/3_1_2_Kimi_LLM_Use.md
@@ -0,0 +1,34 @@
+# KIMI Usage
+## 1. Create the relevant file.
+Create a YAML file, for example, user_kimi.yaml
+Paste the following content into your user_kimi.yaml file.
+```yaml
+name: 'user_kimi_llm'
+description: 'user kimi llm with spi'
+model_name: 'moonshot-v1-8k'
+max_tokens: 1000
+metadata:
+  type: 'LLM'
+  module: 'agentuniverse.llm.default.kimi_openai_style_llm'
+  class: 'KIMIOpenAIStyleLLM'
+```
+## 2. Environment Setup
+Must be configured: KIMI_API_KEY
+Optional: KIMI_PROXY
+### 2.1 Configure through Python code
+```python
+import os
+os.environ['KIMI_API_KEY'] = 'sk-***'
+os.environ['KIMI_PROXY'] = '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
+KIMI_API_KEY="sk-******"
+KIMI_PROXY="https://xxxxxx" 
+```
+## 3. Obtaining the KIMI API KEY 
+Reference KIMI Official Documentation:https://platform.moonshot.cn/console/api-keys
+
+## 4. Tips
+In agentuniverse, we have already created an llm with the name default_kimi_llm. After configuring the KIMI_API_KEY, users can directly use it.
diff --git a/docs/guidebook/en/3_1_2_OpenAI_LLM_Use.md b/docs/guidebook/en/3_1_2_OpenAI_LLM_Use.md
new file mode 100644
index 00000000..9c1a0a0a
--- /dev/null
+++ b/docs/guidebook/en/3_1_2_OpenAI_LLM_Use.md
@@ -0,0 +1,38 @@
+# OpenAI Usage
+## 1. Create the relevant file.
+Create a YAML file, for example, user_openai.yaml
+Paste the following content into your user_openai.yaml file.
+```yaml
+name: 'user_openai_llm'
+description: 'user define openai llm'
+model_name: 'gpt-3.5-turbo'
+max_tokens: 1000
+metadata:
+  type: 'LLM'
+  module: 'agentuniverse.llm.default.default_openai_llm'
+  class: 'DefaultOpenAILLM'
+```
+## 2. Environment Setup
+Must be configured: OPENAI_API_KEY    
+Optional: OPENAI_PROXY, OPENAI_API_BASE
+### 2.1 Configure through Python code
+```python
+import os
+os.environ['OPENAI_API_KEY'] = 'sk-***'
+os.environ['OPENAI_PROXY'] = 'https://xxxxxx'
+os.environ['OPENAI_API_BASE'] = 'http://xxxx/v1'
+```
+### 2.2 Configure through the configuration file
+In the custom_key.toml file under the config directory of the project, add the configuration:
+```toml
+OPENAI_API_KEY="sk-******"
+OPENAI_PROXY="https://xxxxxx"
+OPENAI_API_BASE="http://xxxx/v1"
+```
+## 3. Obtaining the OpenAI API KEY 
+[参考文档](https://platform.openai.com/account/api-keys)
+
+## 4. Tips
+In agentuniverse, we have already created an llm with the name default_openai_llm. After configuring the OPENAI_API_KEY, users can directly use it.
+
+
diff --git a/docs/guidebook/en/3_1_2_Qwen_LLM_Use.md b/docs/guidebook/en/3_1_2_Qwen_LLM_Use.md
new file mode 100644
index 00000000..e58fb1b0
--- /dev/null
+++ b/docs/guidebook/en/3_1_2_Qwen_LLM_Use.md
@@ -0,0 +1,36 @@
+# Qwen Use
+## 1. Create the relevant file.
+Create a YAML file, for example, user_qwen.yaml
+Paste the following content into your user_qwen.yaml file.
+```yaml
+name: 'user_qwen_llm'
+description: 'user qwen llm with spi'
+model_name: 'qwen-turbo'
+max_tokens: 1000
+metadata:
+  type: 'LLM'
+  module: 'agentuniverse.llm.default.qwen_openai_style_llm'
+  class: 'QWenOpenAIStyleLLM'
+```
+## 2. Environment Setup
+Must be configured:DASHSCOPE_API_KEY  
+Optional: DASHSCOPE_PROXY
+### 2.1 Configure through Python code
+```python
+import os
+os.environ['DASHSCOPE_API_KEY'] = 'sk-***'
+os.environ['DASHSCOPE_PROXY'] = '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
+DASHSCOPE_API_KEY="sk-******"
+DASHSCOPE_PROXY="https://xxxxxx"
+```
+## 3. Obtaining the DASHSCOPE API KEY 
+Reference Dashscope Official Documentation：https://dashscope.console.aliyun.com/apiKey
+
+## 4. Tips
+In agentuniverse, we have already created an llm with the name default_qwen_llm. After configuring the DASHSCOPE_API_KEY, users can directly use it.
+
+
diff --git a/docs/guidebook/en/3_1_2_WenXin_LLM_Use.md b/docs/guidebook/en/3_1_2_WenXin_LLM_Use.md
new file mode 100644
index 00000000..c8069a92
--- /dev/null
+++ b/docs/guidebook/en/3_1_2_WenXin_LLM_Use.md
@@ -0,0 +1,38 @@
+# WenXin Usage
+## 1. Create the relevant file.
+Create a YAML file, for example, user_wenxin.yaml
+Paste the following content into your user_wenxin.yaml file.
+```yaml
+name: 'user_wenxin_llm'
+description: 'user wenxin llm with spi'
+model_name: 'ERNIE-3.5-8K'
+max_tokens: 1000
+streaming: true
+metadata:
+  type: 'LLM'
+  module: 'agentuniverse.llm.default.wenxin_llm'
+  class: 'WenXinLLM'
+```
+## 2. Environment Setup
+Must be configured: QIANFAN_AK、QIANFAN_SK
+### 2.1 Configure through Python code
+```python
+import os
+os.environ['QIANFAN_AK'] = '*****'
+os.environ['QIANFAN_SK'] = 'xxxxx'
+```
+### 2.2 Configure through the configuration file
+In the custom_key.toml file under the config directory of the project, add the configuration:
+```toml
+QIANFAN_AK="sk-******"
+QIANFAN_SK="https://xxxxxx"
+```
+## 3. Obtaining the WenXin API KEY 
+Reference QianFan Official Documentation: https://cloud.baidu.com/doc/WENXINWORKSHOP/s/Dlkm79mnx
+
+## 4. Tips
+In agentuniverse, we have already created an llm with the name default_wenxin_llm. After configuring the QIANFAN_AK、QIANFAN_SK, users can directly use it.
+
+
+
+
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 d391d0dd..575106a2 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"
@@ -19,8 +19,12 @@
   * 2.2.1 [智能体(Agent)](2_2_1_智能体.md)
     * 2.2.1.1 [智能体创建与使用](2_2_1_智能体创建与使用.md)
     * 2.2.1.2 [智能体及相关领域对象](2_2_1_智能体及相关领域对象.md)
-  * 2.2.2 模型(LLM)
-  * 2.2.3 工具(Tool)
+  * 2.2.2 [模型(LLM)](2_2_2_模型.md)
+    * 2.2.2.1 [模型定义与使用](2_2_2_模型及相关领域对象.md)
+    * 2.2.2.2 [模型及相关领域对象](2_2_2_模型及相关领域对象.md)
+  * 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)
@@ -39,12 +43,17 @@
 
 **3.组件参考手册**
 * 3.1 领域组件
-  * 3.1.1 智能体(Agent)
-  * 3.1.2 模型(LLM)
-  * 3.1.3 工具(Tool)
-  * 3.1.4 知识(Knowledge)
-  * 3.1.5 记忆(Memory)
-  * 3.1.6 规划(Planner)
+  * 3.1.1 智能体列表(Agent)
+  * 3.1.2 模型列表(LLM)
+    * 3.1.2.1 [OpenAI使用说明](3_1_2_OpenAI使用.md)
+    * 3.1.2.2 [通义千问使用说明](3_1_2_Qwen使用.md)
+    * 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.3 工具列表(Tool)
+  * 3.1.4 知识列表(Knowledge)
+  * 3.1.5 记忆列表(Memory)
+  * 3.1.6 规划列表(Planner)
 * 3.2 技术组件
   * 3.2.1 RPC
     * 3.2.1.1 [gRPC](3_2_1_gRPC.md)
diff --git "a/docs/guidebook/zh/1_4_\345\272\224\347\224\250\345\267\245\347\250\213\347\273\223\346\236\204\345\217\212\350\257\264\346\230\216.md" "b/docs/guidebook/zh/1_4_\345\272\224\347\224\250\345\267\245\347\250\213\347\273\223\346\236\204\345\217\212\350\257\264\346\230\216.md"
index 106ce0f0..d8696af7 100644
--- "a/docs/guidebook/zh/1_4_\345\272\224\347\224\250\345\267\245\347\250\213\347\273\223\346\236\204\345\217\212\350\257\264\346\230\216.md"
+++ "b/docs/guidebook/zh/1_4_\345\272\224\347\224\250\345\267\245\347\250\213\347\273\223\346\236\204\345\217\212\350\257\264\346\230\216.md"
@@ -44,7 +44,7 @@
 ## 使用任意工程目录结构
 您可以将工程目录按照根据您的喜好与实际情况进行调整，但请务必遵循以下的规则。
 
-### bootstarp启动目录 {#bootstarp启动目录}
+### 启动目录bootstarp
 无论您的项目启动脚本在何位置，除测试外请保证应用服务使用如下语句进行服务启动：
 
 ```python
@@ -68,7 +68,7 @@ ServerApplication.start()
 `ServerApplication.start()`为本框架的serve启动方法，其会接收项目配置路径`config_path`作为入参，`config_path`默认路径为项目根路径下的config目录中的文件 `project_root_dir/config/config.toml`，请确保config文件路径正确，如果您进一步变更了config文件的目录，请将`config_path`作为调整；
 
 ### config目录
-如 [bootstarp启动目录](#bootstarp启动目录)部分所述，项目的默认config路径为`project_root_dir/config/config.toml`，若您对其进行了调整，请确保在应用serve启动时将正确的config文件路径传入启动方法。
+如 [启动目录bootstarp](#启动目录bootstarp)部分所述，项目的默认config路径为`project_root_dir/config/config.toml`，若您对其进行了调整，请确保在应用serve启动时将正确的config文件路径传入启动方法。
 
 ### core目录
 如推荐目录结构工程所示，core目录中的工程目录主要用于放置agent、knowledge、LLM等自定义的领域组件，您可以随意所有核心组件的位置并且不局限于同一主包下，只需要在项目工程的主配置文件`config/config.toml`中的`[CORE_PACKAGE]`部分进行定义即可，如下：
diff --git "a/docs/guidebook/zh/2_2_1_\346\231\272\350\203\275\344\275\223\345\210\233\345\273\272\344\270\216\344\275\277\347\224\250.md" "b/docs/guidebook/zh/2_2_1_\346\231\272\350\203\275\344\275\223\345\210\233\345\273\272\344\270\216\344\275\277\347\224\250.md"
index e7bd533c..48531449 100644
--- "a/docs/guidebook/zh/2_2_1_\346\231\272\350\203\275\344\275\223\345\210\233\345\273\272\344\270\216\344\275\277\347\224\250.md"
+++ "b/docs/guidebook/zh/2_2_1_\346\231\272\350\203\275\344\275\223\345\210\233\345\273\272\344\270\216\344\275\277\347\224\250.md"
@@ -24,7 +24,7 @@
   * `name`: LLM 名称
   * `model_name`: LLM 模型名  
 
-  您可以选择已有或接入任意的LLM，我们在本部分不展开说明，您可以关注LLM章节。
+  您可以选择已有或接入任意的LLM，我们在本部分不展开说明，您可以关注[模型LLM章节](2_2_2_模型.md)。
 
 ### 设置智能体计划
 **`plan` - 智能体计划**
@@ -41,7 +41,7 @@
     \- tool_name_b  
     \- tool_name_c  
 
-  您可以选择已有或接入任意的Tool，我们在本部分不展开说明，您可以关注Tool章节。
+  您可以选择已有或接入任意的Tool，我们在本部分不展开说明，您可以关注[Tool章节](2_2_3_工具.md)。
 
 * `Knowledge` : 供智能体使用的知识
   * knowledge_name_list，知识名称列表, 如:  
@@ -62,7 +62,7 @@ agent目前已经内置了默认记忆模式，您无需设置，同时memory是
 * `module`: Agent实体包路径
 * `class`: Agent实体类名
 
-所有已经提供的Agent组件都将提供对应的`module`、`class`复制到该部分即可。该部分会将智能体的所有配置与其行为组成一个整体，若您扩展了智能体的行为，则需要按照实际路径填写这部分，我们将在后文中的 '从已有的智能体对象创建' 小节进一步说明。
+所有已经提供的Agent组件都将提供对应的`module`、`class`复制到该部分即可。该部分会将智能体的所有配置与其行为组成一个整体，若您扩展了智能体的行为，则需要按照实际路径填写这部分，我们将在后文中的[从已有的智能体对象创建](#从已有的智能体对象创建)小节进一步说明。
 
 ### 一个智能体配置的实际样例
 ```yaml
@@ -110,7 +110,7 @@ metadata:
 
 除此之外agentuniverse不限制用户对agent yaml配置内容进行扩展，您可以根据自己的要求创建任何自定义配置key,但请注意不要与上述默认的配置关键字重名。
 
-## 创建智能体领域行为定义 - agent_xx.py
+## 创建智能体领域行为定义 agent_xx.py
 在本部分您可以对任何智能体的行为进行编排与定制，当然如果您完全使用已有的Agent能力那么本部分并非必须。
 
 在本节我们将重点介绍常用的智能体领域行为定义与您可能在实际智能体领域行为定义过程中使用的常用技巧。
@@ -209,8 +209,36 @@ def execute(self, input_object: InputObject, agent_input: dict) -> dict:
 
 智能体的属性与领域行为都依赖于agentUniverse框架中Agent基础类，其路径为`agentuniverse.agent.agent.Agent`, 我们在智能体及相关领域对象章节中也会重点介绍相关的底层对象，若您关注底层技术实现可进一步参考对应的代码与文档；
 
+#### 一个智能体领域行为定义的实际样例
+```python
+from agentuniverse.agent.agent import Agent
+from agentuniverse.agent.input_object import InputObject
+from agentuniverse.agent.plan.planner.planner import Planner
+from agentuniverse.agent.plan.planner.planner_manager import PlannerManager
+
+class DemoRagAgent(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
+
+    # def execute(self, input_object: InputObject, agent_input: dict) -> dict:    
+    #     planner_base: Planner = PlannerManager().get_instance_obj(self.agent_model.plan.get('planner').get('name'))
+    #     planner_result = planner_base.invoke(self.agent_model, agent_input, input_object)
+    #     return planner_result
+```
+上述是一个智能体领域行为定义的实际样例。
+
 ## 关注您定义的智能体所在的包路径
-通过上面的agent配置与领域定于部分，您已经掌握了agent创建的所有步骤；接下去我们将使用这些agent，在使用前请关注创建的agent是否在正确的包扫描路径内。
+通过上面的agent配置与领域定义部分，您已经掌握了agent创建的所有步骤；接下去我们将使用这些agent，在使用前请关注创建的agent是否在正确的包扫描路径内。
 
 在agentUniverse项目的config.toml中需要配置agent文件对应的package, 请再次确认您创建的文件所在的包路径是否在`CORE_PACKAGE`中`agent`路径或其子路径下。
 
@@ -221,9 +249,10 @@ def execute(self, input_object: InputObject, agent_input: dict) -> dict:
 agent = ['sample_standard_app.app.core.agent']
 ```
 
-## agent创建的实用技巧
+## agent创建的其他技巧
 ### 自由定制与编排agent的执行过程
-在本文的 '创建智能体领域行为定义' 的 'execute方法' 部分中我们已经详细说明了如何自定义一个execute方法，这个方法在实践过程经常用来根据用户的诉求定制流程与注入SOP(Standard Operating Procedure)。
+
+在本文的[创建智能体领域行为定义](#创建智能体领域行为定义-agent_xx.py)的execute方法中我们已经详细说明了如何自定义一个execute方法，这个方法在实践过程经常用来根据用户的诉求定制流程与注入SOP(Standard Operating Procedure)。
 
 ### 如何通过用户的输入动态调整设置
 
@@ -262,7 +291,7 @@ instruction: |
 **方法二： 在parse_input方法或execute方法中调整prompt**
 通过agent的`parse_input`方法或`execute`方法我们可以对agent做数据或行为上的定制，同时结合`self.agent_model`中的get方法与智能体输入参数`input_object`，这意味着您可以通过这些定制方法将你的任意设置内容进行修改。
 
-### 从已有的智能体对象创建智能体
+### 从已有的智能体对象创建
 在实际的应用创建过程中，我们可能存在很多同类型的智能体，例如我们想创建许多检索增强RAG(Retrieval Augmented Generation)类型的智能体，运用于不同的问答场景中。分析他们的相同与不同点我们不难发现对于大部分RAG类型的智能体，他们具有如下共性与差异。
 * 主要的相同点：他们往往都需要同时检索多种知识
 * 主要的不同点： 不同场景的RAG智能体需要对应检索不同的工具，可能拥有不同的智能体全局设置
@@ -322,7 +351,7 @@ metadata:
   class: 'RagAgent'
 ```
 
-您可以在本文的 '了解更多已有的智能体' 部分查询更多的agent元信息并了解他们的作用。
+您可以在本文的[了解更多已有的智能体](#了解更多已有的智能体)部分查询更多的agent元信息并了解他们的作用。
 
 # 如何使用智能体
 在agentUniverse中所有agent实体都由全局agent管理器进行管理，在任何框架执行过程中如果您需要使用智能体可以通过agent管理器。同时通过框架的服务化能力，您可以将agent快速服务化并通过标准的http或rpc协议对其进行网络调用。
diff --git "a/docs/guidebook/zh/2_2_2_\346\250\241\345\236\213.md" "b/docs/guidebook/zh/2_2_2_\346\250\241\345\236\213.md"
new file mode 100644
index 00000000..b52efebf
--- /dev/null
+++ "b/docs/guidebook/zh/2_2_2_\346\250\241\345\236\213.md"
@@ -0,0 +1,11 @@
+# 模型(LLM)
+LLM - Large Language Model, 即大型语言模型。 LLM拥有强大的文本生成和理解能力，它能够理解自然语言并使用自然语言与人类交流。它是智能体能够拥有学习、推理、决策和执行能力最重要的模块，经常有人将其比喻成智能体的大脑，它是智能体的智慧核心。
+
+目前如OpenAi、Google、Anthropic、Meta、Alibaba、Baidu等知名企业都提供了各自的大模型服务，同时使用公开的模型训练与微调方案个人或企业也能够定制属于自己的各类LLM，在HuggingFace等模型分享平台中您可以找到海量的LLM。
+
+agentUniverse的LLM模型组件能够帮助您通过简单配置快速接入各类市面上常见的LLM服务，同时标准的LLM模型定义也支持您自定义接入任何公开模型服务、私有模型服务或本地部署模型。
+
+各类不同的LLM拥有不同的能力，他们或在某些评价维度上拥有特长、或适合处理某一些专精领域的任务、或能够处理图像、音频等多模态任务。这些被引入的LLM能力被作为Agent核心组成部分，同时也可以被使用在工具等任何其他组件中，这意味着您可以接入最适合您agent使用的模型进行工作，在多智能体协同过程中不同的agent可以使用不同模型。
+
+# 总结
+至此您已初步了解LLM组件的设计原理，在下一节我们将具体向您介绍LLM组件的标准定义、如何自定义接入LLM、如何使用LLM组件等。
\ No newline at end of file
diff --git "a/docs/guidebook/zh/2_2_2_\346\250\241\345\236\213\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_2_\346\250\241\345\236\213\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..2b2eb2c2
--- /dev/null
+++ "b/docs/guidebook/zh/2_2_2_\346\250\241\345\236\213\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,11 @@
+# 模型与相关领域对象
+在本章节我们会重点列出LLM与相关的核心领域对象, 我们省略了其对应的代码部分，若您希望进一步了解请阅读对应的[API参考部分](4_1_API参考.md)。
+
+## LLM基础类
+包路径：`agentuniverse.llm.llm.LLM`
+
+## LLM管理器
+包路径：`agentuniverse.llm.llm_manager.LLMManager`
+
+## 输出对象
+包路径：`agentuniverse.llm.llm_output.LLMOutput`
\ No newline at end of file
diff --git "a/docs/guidebook/zh/2_2_2_\346\250\241\345\236\213\345\256\232\344\271\211\344\270\216\344\275\277\347\224\250.md" "b/docs/guidebook/zh/2_2_2_\346\250\241\345\236\213\345\256\232\344\271\211\344\270\216\344\275\277\347\224\250.md"
new file mode 100644
index 00000000..77f90a8b
--- /dev/null
+++ "b/docs/guidebook/zh/2_2_2_\346\250\241\345\236\213\345\256\232\344\271\211\344\270\216\344\275\277\347\224\250.md"
@@ -0,0 +1,500 @@
+# 如何定义模型LLM组件
+根据agentUniverse领域组件的设计特性，创建一个模型LLM定义由2部分组成:
+* llm_xx.yaml
+* llm_xx.py
+
+其中`llm_xx.yaml`必须创建, 其包含了LLM组件的名称、描述、模型名等重要属性信息；`llm_xx.py`为按需创建，其包含了llm组件的特定行为并且支持了用户对llm进行标准的行为自定义注入。理解这一原理后，让我们具体看看该如何创建这两部分内容。
+
+## 创建LLM配置 - llm_xx.yaml
+我们将详细介绍配置中的各组成部分。
+
+### 设置LLM的基本属性
+* `name`:  LLM名称，LLM实例名称，您可以按照自己的期望设置任何名字
+* `description`:  LLM描述, 按照您的实际需求填写
+* `model_name`: 接入的LLM模型官方名称，例如OpenAi系列中的`gpt-4o`、`gpt-3.5-turbo`等
+* `max_retries`: LLM访问的最大重试次数
+* `max_tokens`: LLM模型实例支持的最大token数量，该属性必须小于官方提供的model_name可处理token的最大值
+
+### 设置LLM组件元信息
+**`metadata` - 组件元信息**
+* `type` : 组件类型，'LLM'
+* `module`: LLM实体包路径
+* `class`: LLM实体类名
+
+所有已经提供的LLM组件都将提供对应的`module`、`class`信息，复制到该部分即可。该部分会将LLM组件的所有配置与其行为组成一个整体，若您定义了LLM的标准行为，则需要按照实际路径填写这部分，我们将在后文中的[从已有的LLM对象创建](#从已有的LLM对象创建)中进一步说明。
+
+### 一个LLM定义配置的实际样例
+```yaml
+name: 'demo_llm'
+description: 'demo openai'
+model_name: 'gpt-3.5-turbo'
+max_tokens: 1000
+max_retries: 2
+metadata:
+  type: 'LLM'
+  module: 'agentuniverse.llm.default.default_openai_llm'
+  class: 'DefaultOpenAILLM'
+```
+上述是一个实际的LLM配置的样例。除了上述介绍的标准配置项。
+
+您可以在我们的样例工程中的`sample_standard_app.app.core.llm`路径下更多的LLM配置yaml样例。
+
+除此之外agentuniverse不限制用户对LLM yaml配置内容进行扩展，您可以根据自己的要求创建任何自定义配置key,但请注意不要与上述默认的配置关键字重名。
+
+## 创建LLM领域行为定义 - llm_xx.py
+在本部分您可以对任何LLM的行为进行扩展，当然如果您完全使用已有的LLM能力那么本部分并非必须。
+
+在本节我们将重点介绍常用的LLM的行为定义与您可能在实际LLM行为定义过程中使用的常用技巧。
+
+### 创建LLM类对象
+创建对应的LLM类对象并继承agentUniverse框架LLM基础类 `LLM`;
+
+### 定制对应的LLM领域行为
+常用可定制的LLM行为如下。
+
+#### _new_client方法
+我们知道非常多的模型服务提供了标准的client sdk，在这个方法中您可以将LLM服务官方提供的client进行注入，如果您使用的模型并没有提供标准的client这一步是非必需的。
+
+```python
+def _new_client(self):
+        """Initialize the client."""
+        pass
+```
+
+#### _new_async_client方法
+同`_new_client方法`，在这个方法中您可以将LLM服务官方提供的异步client进行注入，如果您使用的模型并没有提供标准的异步client这一步是非必需的。
+
+```python
+def _new_async_client(self):
+        """Initialize the async client."""
+        pass
+```
+
+#### call和acall方法
+LLM基础类提供的call（同步调用）和acall（异步调用）两个抽象方法，用户可以通过实现call和acall方法自定义模型调用方式。
+其标准定义如下：
+```python
+from abc import abstractmethod
+from typing import Optional, Any, AsyncIterator, Iterator, Union
+from agentuniverse.llm.llm_output import LLMOutput
+
+@abstractmethod
+def call(self, *args: Any, **kwargs: Any) -> Union[LLMOutput, Iterator[LLMOutput]]:
+    """Run the LLM."""
+
+@abstractmethod
+async def acall(self, *args: Any, **kwargs: Any) -> Union[LLMOutput, AsyncIterator[LLMOutput]]:
+    """Asynchronously run the LLM."""
+```
+
+#### as_langchain方法
+agentUniverse在底层使用了langchain的能力，agentUniverse兼容使用langchain的LLM的定义方式，若您的项目已使用过langchain，那么在本方法中只需要将Langchain框架BaseLanguageModel基础模型放入即可将agentUniverse与langchain融合使用。agentUniverse在可支持与Langchain、Semantic Kernel等任何类似的orchestration框架融合，当前我们聚焦在langchain上。
+
+```python
+from langchain_core.language_models.base import BaseLanguageModel
+
+def as_langchain(self) -> BaseLanguageModel:
+        """Convert to the langchain llm class."""
+        pass
+```
+
+#### max_context_length方法
+定义LLM模型对应的上下文长度，如GPT-4 max_context_length方法返回8192，GPT-3.5-turbo max_context_length返回4096，您可以在模型的官方文档里找到这个数字。
+
+#### get_num_tokens方法
+get_num_tokens定义模型的编码方式及token计算方式，传入数据，输出数据对应的token数量。
+
+#### 一个实际的LLM领域行为定义样例
+
+以Open系列LLM定义为例，OpenAILLM.py
+
+```python
+from typing import Any, Optional, AsyncIterator, Iterator, Union
+
+import httpx
+from langchain_core.language_models.base import BaseLanguageModel
+from openai import OpenAI, AsyncOpenAI
+from pydantic import Field
+import tiktoken
+
+from agentuniverse.llm.langchain_instance import LangchainOpenAI
+from agentuniverse.llm.llm import LLM, LLMOutput
+from agentuniverse.base.util.env_util import get_from_env
+
+OPENAI_MAX_CONTEXT_LENGTH = {
+    "gpt-3.5-turbo": 4096,
+    "gpt-3.5-turbo-0301": 4096,
+    "gpt-3.5-turbo-0613": 4096,
+    "gpt-3.5-turbo-16k": 16384,
+    "gpt-3.5-turbo-16k-0613": 16384,
+    "gpt-35-turbo": 4096,
+    "gpt-35-turbo-16k": 16384,
+    "gpt-3.5-turbo-1106": 16384,
+    "gpt-3.5-turbo-0125": 16384,
+    "gpt-4-0314": 8192,
+    "gpt-4": 8192,
+    "gpt-4-32k": 32768,
+    "gpt-4-32k-0613": 32768,
+    "gpt-4-0613": 8192,
+    "gpt-4-1106-preview": 128000,
+    "gpt-4-turbo": 128000,
+    "gpt-4o": 128000,
+    "gpt-4o-2024-05-13": 128000,
+}
+
+
+class OpenAILLM(LLM):
+    """The openai llm class.
+
+    Attributes:
+        openai_api_key (Optional[str], optional): The API key for the OpenAI API.
+        This automatically infers the `openai_api_key` from the environment variable `OPENAI_API_KEY` if not provided.
+
+        openai_organization (Optional[str], optional): The OpenAI organization.
+        This automatically infers the `openai_organization` from the environment variable `OPENAI_ORGANIZATION` if not provided.
+
+        openai_api_base (Optional[str], optional): The OpenAI base url.
+        This automatically infers the `openai_api_base` from the environment variable `OPENAI_API_BASE` if not provided.
+
+        openai_client_args (Optional[dict], optional): Additional arguments to pass to the OpenAI client.
+   """
+
+    openai_api_key: Optional[str] = Field(default_factory=lambda: get_from_env("OPENAI_API_KEY"))
+    openai_organization: Optional[str] = Field(default_factory=lambda: get_from_env("OPENAI_ORGANIZATION"))
+    openai_api_base: Optional[str] = Field(default_factory=lambda: get_from_env("OPENAI_API_BASE"))
+    openai_proxy: Optional[str] = Field(default_factory=lambda: get_from_env("OPENAI_PROXY"))
+    openai_client_args: Optional[dict] = None
+
+    def _new_client(self):
+        """Initialize the openai client."""
+        return OpenAI(
+            api_key=self.openai_api_key,
+            organization=self.openai_organization,
+            base_url=self.openai_api_base,
+            timeout=self.request_timeout,
+            max_retries=self.max_retries,
+            http_client=httpx.Client(proxy=self.openai_proxy) if self.openai_proxy else None,
+            **(self.openai_client_args or {}),
+        )
+
+    def _new_async_client(self):
+        """Initialize the openai async client."""
+        return AsyncOpenAI(
+            api_key=self.openai_api_key,
+            organization=self.openai_organization,
+            base_url=self.openai_api_base,
+            timeout=self.request_timeout,
+            max_retries=self.max_retries,
+            http_client=httpx.AsyncClient(proxy=self.openai_proxy) if self.openai_proxy else None,
+            **(self.openai_client_args or {}),
+        )
+
+    def call(self, messages: list, **kwargs: Any) -> Union[LLMOutput, Iterator[LLMOutput]]:
+        """Run the OpenAI LLM.
+
+        Args:
+            messages (list): The messages to send to the LLM.
+            **kwargs: Arbitrary keyword arguments.
+        """
+        streaming = kwargs.pop("streaming") if "streaming" in kwargs else self.streaming
+        self.client = self._new_client()
+        with self.client as client:
+            chat_completion = client.chat.completions.create(
+                messages=messages,
+                model=kwargs.pop('model', self.model_name),
+                temperature=kwargs.pop('temperature', self.temperature),
+                stream=kwargs.pop('stream', streaming),
+                max_tokens=kwargs.pop('max_tokens', self.max_tokens),
+                **kwargs,
+            )
+            if not streaming:
+                text = chat_completion.choices[0].message.content
+                return LLMOutput(text=text, raw=chat_completion.model_dump())
+            return self.generate_stream_result(chat_completion)
+
+    async def acall(self, messages: list, **kwargs: Any) -> Union[LLMOutput, AsyncIterator[LLMOutput]]:
+        """Asynchronously run the OpenAI LLM.
+
+        Args:
+            messages (list): The messages to send to the LLM.
+            **kwargs: Arbitrary keyword arguments.
+        """
+        streaming = kwargs.pop("streaming") if "streaming" in kwargs else self.streaming
+        self.async_client = self._new_async_client()
+        async with self.async_client as async_client:
+            chat_completion = await async_client.chat.completions.create(
+                messages=messages,
+                model=kwargs.pop('model', self.model_name),
+                temperature=kwargs.pop('temperature', self.temperature),
+                stream=kwargs.pop('stream', streaming),
+                max_tokens=kwargs.pop('max_tokens', self.max_tokens),
+                **kwargs,
+            )
+            if not streaming:
+                text = chat_completion.choices[0].message.content
+                return LLMOutput(text=text, raw=chat_completion.model_dump())
+            return self.agenerate_stream_result(chat_completion)
+
+    def as_langchain(self) -> BaseLanguageModel:
+        """Convert the AgentUniverse(AU) openai llm class to the langchain openai llm class."""
+        return LangchainOpenAI(self)
+
+    def max_context_length(self) -> int:
+        """Max context length.
+
+          The total length of input tokens and generated tokens is limited by the openai model's context length.
+          """
+        return OPENAI_MAX_CONTEXT_LENGTH.get(self.model_name, 4096)
+
+    def get_num_tokens(self, text: str) -> int:
+        """Get the number of tokens present in the text.
+
+        Useful for checking if an input will fit in an openai model's context window.
+
+        Args:
+            text: The string input to tokenize.
+
+        Returns:
+            The integer number of tokens in the text.
+        """
+        try:
+            encoding = tiktoken.encoding_for_model(self.model_name)
+        except KeyError:
+            encoding = tiktoken.get_encoding("cl100k_base")
+        return len(encoding.encode(text))
+
+    @staticmethod
+    def parse_result(chunk):
+        """Generate the result of the stream."""
+        chat_completion = chunk
+        if not isinstance(chunk, dict):
+            chunk = chunk.dict()
+        if len(chunk["choices"]) == 0:
+            return
+        choice = chunk["choices"][0]
+        message = choice.get("delta")
+        text = message.get("content")
+        if not text:
+            return
+        return LLMOutput(text=text, raw=chat_completion.model_dump())
+
+    @classmethod
+    def generate_stream_result(cls, stream: Iterator) -> Iterator[LLMOutput]:
+        """Generate the result of the stream."""
+        for chunk in stream:
+            llm_output = cls.parse_result(chunk)
+            if llm_output:
+                yield llm_output
+
+    @classmethod
+    async def agenerate_stream_result(cls, stream: AsyncIterator) -> AsyncIterator[LLMOutput]:
+        """Generate the result of the stream."""
+        async for chunk in stream:
+            llm_output = cls.parse_result(chunk)
+            if llm_output:
+                yield llm_output
+```
+在上述的样例中，我们通过`_new_client`、`_new_async_client`方法接入了OpenAi标准的client sdk，实现`call`与`acall`实现OpenAi标准同步、异步调用方式，通过在`as_langchain`中引入LangchainOpenAI对象完成与langchain框架的融合。
+
+LangchainOpenAI.py 为langchain的BaseLanguageModel对象，可关注下列例子。
+```python
+from typing import Any, List, Optional, AsyncIterator
+
+from langchain.callbacks.manager import AsyncCallbackManagerForLLMRun, CallbackManagerForLLMRun
+from langchain.chat_models import ChatOpenAI
+from langchain.schema import BaseMessage, ChatResult
+from langchain_community.chat_models.openai import _convert_delta_to_message_chunk
+from langchain_core.language_models.chat_models import generate_from_stream, agenerate_from_stream
+from langchain_core.messages import AIMessageChunk
+from langchain_core.outputs import ChatGenerationChunk
+
+from agentuniverse.llm.llm import LLM
+
+
+class LangchainOpenAI(ChatOpenAI):
+    """Langchain OpenAI LLM wrapper."""
+
+    llm: Optional[LLM] = None
+
+    def __init__(self, llm: LLM):
+        """The __init__ method.
+
+        The agentUniverse LLM instance is passed to this class as an argument.
+        Convert the attributes of AgentUniverse(AU) LLM instance to the LangchainOpenAI object for initialization
+
+        Args:
+            llm (LLM): the AgentUniverse(AU) LLM instance.
+        """
+        init_params = dict()
+        init_params['model_name'] = llm.model_name if llm.model_name else 'gpt-3.5-turbo'
+        init_params['temperature'] = llm.temperature if llm.temperature else 0.7
+        init_params['request_timeout'] = llm.request_timeout
+        init_params['max_tokens'] = llm.max_tokens
+        init_params['max_retries'] = llm.max_retries if llm.max_retries else 2
+        init_params['streaming'] = llm.streaming if llm.streaming else False
+        init_params['openai_api_key'] = llm.openai_api_key if llm.openai_api_key else 'blank'
+        init_params['openai_organization'] = llm.openai_organization
+        init_params['openai_api_base'] = llm.openai_api_base
+        init_params['openai_proxy'] = llm.openai_proxy
+        super().__init__(**init_params)
+        self.llm = llm
+
+    def _generate(
+            self,
+            messages: List[BaseMessage],
+            stop: Optional[List[str]] = None,
+            run_manager: Optional[CallbackManagerForLLMRun] = None,
+            stream: Optional[bool] = None,
+            **kwargs,
+    ) -> ChatResult:
+        """Run the Langchain OpenAI LLM."""
+        should_stream = stream if stream is not None else self.streaming
+        message_dicts, params = self._create_message_dicts(messages, stop)
+        params = {**params, **kwargs}
+        llm_output = self.llm.call(messages=message_dicts, **params)
+        if not should_stream:
+            return self._create_chat_result(llm_output.raw)
+        stream_iter = self.as_langchain_chunk(llm_output)
+        return generate_from_stream(stream_iter)
+
+    async def _agenerate(
+            self,
+            messages: List[BaseMessage],
+            stop: Optional[List[str]] = None,
+            run_manager: Optional[AsyncCallbackManagerForLLMRun] = None,
+            stream: Optional[bool] = None,
+            **kwargs: Any,
+    ) -> ChatResult:
+        """Asynchronously run the Langchain OpenAI LLM."""
+        should_stream = stream if stream is not None else self.streaming
+        message_dicts, params = self._create_message_dicts(messages, stop)
+        params = {**params, **kwargs}
+        llm_output = await self.llm.acall(messages=message_dicts, **params)
+        if not should_stream:
+            return self._create_chat_result(llm_output.raw)
+        stream_iter = self.as_langchain_achunk(llm_output)
+        return await agenerate_from_stream(stream_iter)
+
+    @staticmethod
+    def as_langchain_chunk(stream, run_manager=None):
+        default_chunk_class = AIMessageChunk
+        for llm_result in stream:
+            chunk = llm_result.raw
+            if not isinstance(chunk, dict):
+                chunk = chunk.dict()
+            if len(chunk["choices"]) == 0:
+                continue
+            choice = chunk["choices"][0]
+            chunk = _convert_delta_to_message_chunk(
+                choice["delta"], default_chunk_class
+            )
+            finish_reason = choice.get("finish_reason")
+            generation_info = (
+                dict(finish_reason=finish_reason) if finish_reason is not None else None
+            )
+            default_chunk_class = chunk.__class__
+            chunk = ChatGenerationChunk(message=chunk, generation_info=generation_info)
+            yield chunk
+            if run_manager:
+                run_manager.on_llm_new_token(chunk.text, chunk=chunk)
+
+    @staticmethod
+    async def as_langchain_achunk(stream_iterator: AsyncIterator, run_manager=None) \
+            -> AsyncIterator[ChatGenerationChunk]:
+        default_chunk_class = AIMessageChunk
+        async for llm_result in stream_iterator:
+            chunk = llm_result.raw
+            if not isinstance(chunk, dict):
+                chunk = chunk.dict()
+            if len(chunk["choices"]) == 0:
+                continue
+            choice = chunk["choices"][0]
+            chunk = _convert_delta_to_message_chunk(
+                choice["delta"], default_chunk_class
+            )
+            finish_reason = choice.get("finish_reason")
+            generation_info = (
+                dict(finish_reason=finish_reason) if finish_reason is not None else None
+            )
+            default_chunk_class = chunk.__class__
+            chunk = ChatGenerationChunk(message=chunk, generation_info=generation_info)
+            yield chunk
+            if run_manager:
+                await run_manager.on_llm_new_token(token=chunk.text, chunk=chunk)
+```
+在agentUniverse与langchain的融合对象中，您只需要重构langchain的LLM模型生成`_generate`与`_agenerate`方法即可，其中重点使用了`self.llm.call`与`self.llm.acall`方法，其他部分我们在后文的实用技巧中会提及在此不额外说明。
+
+## 关注您定义的LLM所在的包路径
+通过上面的LLM配置与领域定义部分，您已经掌握了LLM定义创建的所有步骤；接下去我们将使用这些LLM，在使用前请关注创建的LLM是否在正确的包扫描路径内。
+
+在agentUniverse项目的config.toml中需要配置LLM文件对应的package, 请再次确认您创建的文件所在的包路径是否在`CORE_PACKAGE`中`llm`路径或其子路径下。
+
+以示例工程中的配置为例，如下：
+```yaml
+[CORE_PACKAGE]
+# Scan and register llm components for all paths under this list, with priority over the default.
+llm = ['sample_standard_app.app.core.llm']
+```
+
+## 关注您使用的LLM关联的api_key
+模型的api_key基础参数,以openai为例如openai_api_key、openai_organization、openai_base、openai_proxy等信息，您可以将信息配置在系统环境变量，模型对象在创建初始化实例过程中会读取对应系统环境变量，实现参数装配；此外您也可以将密钥等信息配置在agentUniverse的custom_key.toml中（我们推荐您将这类配置放置在工程外或在.gitignore中去除跟踪，以避免关键信息被git跟踪而泄漏），agentUniverse系统初始化过程中，会自动读取配置文件，将配置信息自动注册到系统环境变量中。
+
+下面是一个实际的`custom_key.toml`配置:
+```toml
+# Example file of custom_key.toml. Rename to custom_key.toml while using.
+[KEY_LIST]
+# Perform a full component scan and registration for all the paths under this list.
+SERPER_API_KEY='xxx'
+OPENAI_API_KEY='xxx'
+```
+
+## 模型LLM组件创建的其他技巧
+### 加入LLM流式能力
+在[定制对应的LLM领域行为](#一个实际的LLM领域行为定义样例)的样例中已经提供了流式能力的能力，您可以关注`call`与`acall`中的`generate_stream_result`与`agenerate_stream_result`方法。
+
+如果您使用了Langchain对应的LLM类，需要在`_generate`与`_agenerate`中实现流式返回，可重点关注样例LangchainOpenAI.py中的`as_langchain_chunk`与`as_langchain_achunk`方法。
+
+### 从已有的LLM对象创建
+agentUniverse允许从已有的LLM组件对象中快速创建LLM实例。
+如OpenAI的LLM系列已经由框架提供，其标准的元信息如下：
+```text
+module: 'agentuniverse.llm.default.default_openai_llm'
+class: 'DefaultOpenAILLM'
+```
+
+假如我们需要配置定义一个基于`gpt-3.5-turbo`模型，最大token限制为1000，失败重试次数未2次的LLM实例，其配置如下:
+```yaml
+name: 'demo_llm'
+description: 'demo openai'
+model_name: 'gpt-3.5-turbo'
+max_tokens: 1000
+max_retries: 2
+metadata:
+  type: 'LLM'
+  module: 'agentuniverse.llm.default.default_openai_llm'
+  class: 'DefaultOpenAILLM'
+```
+
+您可以在本文的[了解更多已有模型LLM组件](#了解更多已有模型LLM组件)部分查询更多的LLM元信息。
+
+# 如何使用模型LLM组件
+## 在Agent中配置使用
+您可以根据[智能体创建与使用](2_2_1_智能体创建与使用.md)中的内容在agent的llm_model中设置您创建的任意LLM。
+
+可参考示例：`demo_multillm_agent`， 具体文件路径为 `sample_standard_app/app/core/agent/rag_agent_case/demo_multillm_agent.yaml`。
+
+## 使用LLM管理器
+通过LLM管理器中的`.get_instance_obj(xx_llm_name)` 方法可以获取对应名称的LLM实例。
+
+```python
+from agentuniverse.llm.llm import LLM
+from agentuniverse.llm.llm_manager import LLMManager
+
+llm: LLM = LLMManager().get_instance_obj('llm_name')
+```
+
+# 了解更多已有模型LLM组件
+框架提供的更多LLM组件在`agentuniverse.llm.default`包路径下，您可以进一步查看对应代码或在我们的扩展组件介绍部分进一步了解他们，更多已经接入的模型您可以在[模型列表章节](3_1_2_0_模型列表.md)中了解。
+
+# 总结
+至此您已经掌握了模型LLM的定义与使用，赶快去尝试定义与使用LLM吧。
\ No newline at end of file
diff --git "a/docs/guidebook/zh/2_2_3_\345\267\245\345\205\267.md" "b/docs/guidebook/zh/2_2_3_\345\267\245\345\205\267.md"
new file mode 100644
index 00000000..a76b918b
--- /dev/null
+++ "b/docs/guidebook/zh/2_2_3_\345\267\245\345\205\267.md"
@@ -0,0 +1,10 @@
+# 工具(Tool)
+同人类使用与创造工具一样，智能体也可以借助工具拓展其能力边界、提升专业性，补充LLM中原本能力的不足。
+
+在复杂的任务场景中，往往需要专业工具提升智能体们的任务表现，这些工具可以是原本任务领域内已有的API或方法，也可以是用户为了解决问题而新创建出来的方法。
+
+agentUniverse提供了自定义工具的标准方法，结合底层的rpc技术组件与标准的http协议，您可以将任何API与本地代码片段注册成标准的工具供agent与其他组件使用。
+
+# 总结
+至此您已初步了解工具组件的设计原理，在下一节我们将具体向您介绍工具组件的标准定义、如何自定义创建工具、如何使用工具等。
+
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"
new file mode 100644
index 00000000..9961fc92
--- /dev/null
+++ "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"
@@ -0,0 +1,104 @@
+# 如何定义工具Tool组件
+根据agentUniverse领域组件的设计特性，同其他组件一样，创建一个工具Tool定义由2部分组成:
+* tool_xx.yaml
+* tool_xx.py
+
+其中`tool_xx.yaml`包含了Tool组件的名称、描述、出入参等重要属性信息；`tool_xx.py`包含了工具的具体定义。理解这一原理后，让我们具体看看该如何创建这两部分内容。
+
+## 创建Tool配置 - tool_xx.yaml
+我们将详细介绍配置中的各组成部分。
+
+### 设置Tool的基本属性
+* `name`:  工具名称，您可以按照自己的期望设置任何名字
+* `description`:  工具描述, 按照您的实际需求填写
+* `input_keys`: 类型`list`，输入参数列表
+
+### 设置Tool组件元信息
+**`metadata` - 组件元信息**
+* `type` : 组件类型，'TOOL'
+* `module`: 工具实体包路径
+* `class`: 工具实体类名
+
+### 一个Tool定义配置的实际样例
+```yaml
+name: 'google_search_tool'
+description: 'demo google search tool'
+input_keys: ['input']
+metadata:
+  type: 'TOOL'
+  module: 'xxx.tool.google_search_tool'
+  class: 'GoogleSearchTool'
+```
+
+上述是一个实际的Tool配置的样例。除了上述介绍的标准配置项。
+
+您可以在我们的样例工程中的`sample_standard_app.app.core.tool`路径下更多的tool配置yaml样例。
+
+除此之外agentuniverse不限制用户对tool yaml配置内容进行扩展，您可以根据自己的要求创建任何自定义配置key,但请注意不要与上述默认的配置关键字重名。
+
+## 创建Tool领域行为定义 - tool_xx.py
+
+### 创建Tool类对象
+创建对应的Tool类对象并继承agentUniverse框架Tool基础类 `Tool`;
+
+### 编写工具类对象execute方法
+在`execute`方法中编写工具的实际逻辑片段。
+
+```text
+@abstractmethod
+def execute(self, tool_input: ToolInput):
+    raise NotImplementedError
+```
+
+#### 一个实际的tool对象定义样例
+```python
+from langchain_community.utilities.google_serper import GoogleSerperAPIWrapper
+from antfinagentframework.agent.action.tool.tool import Tool, ToolInput
+
+
+class GoogleSearchTool(Tool):
+    """The demo google search tool.
+
+    Implement the execute method of demo google search tool, using the `GoogleSerperAPIWrapper` to implement a simple Google search.
+
+    Note:
+        You need to sign up for a free account at https://serper.dev and get the serpher api key (2500 free queries).
+    """
+
+    def execute(self, tool_input: ToolInput):
+        query = tool_input.get_data("input")
+        # get top3 results from Google search.
+        search = GoogleSerperAPIWrapper(serper_api_key='', k=3, type="search")
+        return search.run(query=query)
+```
+在这个样例中我们接入了google的search工具, 该工具会检索返回与搜索内容最相近的的3条内容。
+
+## 关注您定义的Tool所在的包路径
+通过上面的Tool配置与定义，您已经掌握了工具创建的所有步骤；接下去我们将使用这些Tool，在使用前请关注创建的Tool是否在正确的包扫描路径内。
+
+在agentUniverse项目的config.toml中需要配置Tool配置对应的package, 请再次确认您创建的文件所在的包路径是否在`CORE_PACKAGE`中`tool`路径或其子路径下。
+
+以示例工程中的配置为例，如下：
+```yaml
+[CORE_PACKAGE]
+# Scan and register tool components for all paths under this list, with priority over the default.
+tool = ['sample_standard_app.app.core.tool']
+```
+
+# 如何使用工具Tool组件
+## 使用Tool管理器
+通过Tool管理器中的`.get_instance_obj(xx_tool_name)` 方法可以获取对应名称的Tool实例, 使用`run`方法进行调用。
+
+```python
+from agentuniverse.agent.action.tool.tool_manager import ToolManager
+
+tool = ToolManager().get_instance_obj('your_tool_name')
+tool_input = {'your_input_key': 'input_values'}
+tool.run(**tool_input)
+```
+
+# 了解更多已有工具Tool
+框架提供的更多Tool示例在`sample_standard_app.app.core.tool`包路径下，您可以进一步查看对应的工具。
+
+# 总结
+至此您已经掌握了工具Tool的定义与使用，赶快去尝试创建与使用工具吧。
diff --git "a/docs/guidebook/zh/2_2_3_\345\267\245\345\205\267\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_3_\345\267\245\345\205\267\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..7239eba1
--- /dev/null
+++ "b/docs/guidebook/zh/2_2_3_\345\267\245\345\205\267\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,11 @@
+# 工具与相关领域对象
+在本章节我们会重点列出Tool与相关的核心领域对象, 我们省略了其对应的代码部分，若您希望进一步了解请阅读对应的[API参考部分](4_1_API参考.md)。
+
+## Tool基础类
+包路径：`agentuniverse.agent.action.tool.tool.Tool`
+
+## Tool管理器
+包路径：`agentuniverse.agent.action.tool.tool_manager.ToolManager`
+
+## 输入对象
+包路径：`agentuniverse.agent.action.tool.tool.ToolInput`
\ 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"
new file mode 100644
index 00000000..4791894c
--- /dev/null
+++ "b/docs/guidebook/zh/3_1_2_0_\346\250\241\345\236\213\345\210\227\350\241\250.md"
@@ -0,0 +1,14 @@
+# 模型（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)          |
+
+未在列表中的模型您可以根据[模型定义](2_2_2_模型定义与使用.md)中的步骤自定义接入任何模型。
+
+同时我们正在添加Claude、Gemini、ollama、Llama、ZhipuAI等常见LLM的接入方式，如果您在工程中使用了这些LLM并创建了属于自己的实例，欢迎您提交pr成为agentUniverse的contributor。
\ No newline at end of file
diff --git "a/docs/guidebook/zh/3_1_2_Kimi\344\275\277\347\224\250.md" "b/docs/guidebook/zh/3_1_2_Kimi\344\275\277\347\224\250.md"
new file mode 100644
index 00000000..f5644725
--- /dev/null
+++ "b/docs/guidebook/zh/3_1_2_Kimi\344\275\277\347\224\250.md"
@@ -0,0 +1,34 @@
+# KIMI 使用
+## 1. 创建相关文件
+创建一个yaml文件，例如 user_kimi.yaml
+将以下内容粘贴到您的user_kimi.yaml文件当中
+```yaml
+name: 'user_kimi_llm'
+description: 'user kimi llm with spi'
+model_name: 'moonshot-v1-8k'
+max_tokens: 1000
+metadata:
+  type: 'LLM'
+  module: 'agentuniverse.llm.default.kimi_openai_style_llm'
+  class: 'KIMIOpenAIStyleLLM'
+```
+## 2. 环境设置
+必须配置：KIMI_API_KEY
+选配：KIMI_PROXY
+### 2.1 通过python代码配置
+```python
+import os
+os.environ['KIMI_API_KEY'] = 'sk-***'
+os.environ['KIMI_PROXY'] = 'https://xxxxxx'
+```
+### 2.2 通过配置文件配置
+在项目的config目录下的custom_key.toml当中，添加配置：
+```toml
+KIMI_API_KEY="sk-******"
+KIMI_PROXY="https://xxxxxx" 
+```
+## 3. KIMI API KEY 获取
+参考 KIMI 官方文档：https://platform.moonshot.cn/console/api-keys
+
+## 4. Tips
+在agentuniverse中，我们已经创建了一个name为default_kimi_llm的llm,用户在配置KIMI_API_KEY之后可以直接使用。
diff --git "a/docs/guidebook/zh/3_1_2_OpenAI\344\275\277\347\224\250.md" "b/docs/guidebook/zh/3_1_2_OpenAI\344\275\277\347\224\250.md"
new file mode 100644
index 00000000..b3fe7188
--- /dev/null
+++ "b/docs/guidebook/zh/3_1_2_OpenAI\344\275\277\347\224\250.md"
@@ -0,0 +1,38 @@
+# OpenAI 使用
+## 1. 创建相关文件
+
+创建一个yaml文件，例如 user_openai.yaml
+将以下内容粘贴到您的user_openai.yaml文件当中
+```yaml
+name: 'user_openai_llm'
+description: 'user define openai llm'
+model_name: 'gpt-3.5-turbo'
+max_tokens: 1000
+metadata:
+  type: 'LLM'
+  module: 'agentuniverse.llm.default.default_openai_llm'
+  class: 'DefaultOpenAILLM'
+```
+## 2. 环境设置
+必须配置：OPENAI_API_KEY    
+可选配置：OPENAI_PROXY, OPENAI_API_BASE
+### 2.1 通过python代码配置
+```python
+import os
+os.environ['OPENAI_API_KEY'] = 'sk-***'
+os.environ['OPENAI_PROXY'] = 'https://xxxxxx'
+os.environ['OPENAI_API_BASE'] = 'http://xxxx/v1'
+```
+### 2.2 通过配置文件配置
+在项目的config目录下的custom_key.toml当中，添加配置：
+```toml
+OPENAI_API_KEY="sk-******"
+OPENAI_PROXY="https://xxxxxx"
+OPENAI_API_BASE="http://xxxx/v1"
+```
+## 3. API KEY 获取
+[参考文档](https://platform.openai.com/account/api-keys)
+
+## 4. Tips
+在agentuniverse中，我们已经创建了一个name为default_openai_llm的llm,用户在配置OPENAI_API_KEY之后可以直接使用。
+
diff --git "a/docs/guidebook/zh/3_1_2_Qwen\344\275\277\347\224\250.md" "b/docs/guidebook/zh/3_1_2_Qwen\344\275\277\347\224\250.md"
new file mode 100644
index 00000000..4e5cf28a
--- /dev/null
+++ "b/docs/guidebook/zh/3_1_2_Qwen\344\275\277\347\224\250.md"
@@ -0,0 +1,37 @@
+# Qwen 使用
+## 1. 创建相关文件
+
+创建一个yaml文件，例如 user_qwen.yaml
+将以下内容粘贴到您的user_qwen.yaml文件当中
+```yaml
+name: 'user_qwen_llm'
+description: 'user qwen llm with spi'
+model_name: 'qwen-turbo'
+max_tokens: 1000
+metadata:
+  type: 'LLM'
+  module: 'agentuniverse.llm.default.qwen_openai_style_llm'
+  class: 'QWenOpenAIStyleLLM'
+```
+## 2. 环境设置
+必须配置：DASHSCOPE_API_KEY  
+可选配置：DASHSCOPE_PROXY
+### 2.1 通过python代码配置
+```python
+import os
+os.environ['DASHSCOPE_API_KEY'] = 'sk-***'
+os.environ['DASHSCOPE_PROXY'] = 'https://xxxxxx'
+```
+### 2.2 通过配置文件配置
+在项目的config目录下的custom_key.toml当中，添加配置：
+```toml
+DASHSCOPE_API_KEY="sk-******"
+DASHSCOPE_PROXY="https://xxxxxx"
+```
+## 3. DASHSCOPE API KEY 获取
+参考 Dashscope 官方文档：https://dashscope.console.aliyun.com/apiKey
+
+## 4. Tips
+在agentuniverse中，我们已经创建了一个name为default_qwen_llm的llm,用户在配置DASHSCOPE_API_KEY之后可以直接使用。
+
+
diff --git "a/docs/guidebook/zh/3_1_2_\346\226\207\345\277\203\344\275\277\347\224\250.md" "b/docs/guidebook/zh/3_1_2_\346\226\207\345\277\203\344\275\277\347\224\250.md"
new file mode 100644
index 00000000..9a09b4d7
--- /dev/null
+++ "b/docs/guidebook/zh/3_1_2_\346\226\207\345\277\203\344\275\277\347\224\250.md"
@@ -0,0 +1,37 @@
+# WenXin 使用
+## 1. 创建相关文件
+创建一个yaml文件，例如 user_wenxin.yaml
+将以下内容粘贴到您的user_wenxin.yaml文件当中
+```yaml
+name: 'user_wenxin_llm'
+description: 'user wenxin llm with spi'
+model_name: 'ERNIE-3.5-8K'
+max_tokens: 1000
+streaming: true
+metadata:
+  type: 'LLM'
+  module: 'agentuniverse.llm.default.wenxin_llm'
+  class: 'WenXinLLM'
+```
+## 2. 环境设置
+必须配置：QIANFAN_AK、QIANFAN_SK
+### 2.1 通过python代码配置
+```python
+import os
+os.environ['QIANFAN_AK'] = '*****'
+os.environ['QIANFAN_SK'] = 'xxxxx'
+```
+### 2.2 通过配置文件配置
+在项目的config目录下的custom_key.toml当中，添加配置：
+```toml
+QIANFAN_AK="sk-******"
+QIANFAN_SK="https://xxxxxx"
+```
+## 3.QIANFAN API KEY 获取
+参考 千帆 官方文档：https://cloud.baidu.com/doc/WENXINWORKSHOP/s/Dlkm79mnx
+
+## 4. Tips
+在agentuniverse中，我们已经创建了一个name为default_wenxin_llm的llm,用户在配置QIANFAN_AK、QIANFAN_SK之后可以直接使用。
+
+
+
diff --git "a/docs/guidebook/zh/3_1_2_\347\231\276\345\267\235\344\275\277\347\224\250.md" "b/docs/guidebook/zh/3_1_2_\347\231\276\345\267\235\344\275\277\347\224\250.md"
new file mode 100644
index 00000000..9dbf1687
--- /dev/null
+++ "b/docs/guidebook/zh/3_1_2_\347\231\276\345\267\235\344\275\277\347\224\250.md"
@@ -0,0 +1,37 @@
+# 百川 使用
+## 1. 创建相关文件
+创建一个yaml文件，例如 user_baichuan.yaml
+将以下内容粘贴到您的user_baichuan.yaml文件当中
+```yaml
+name: 'user_baichuan_llm'
+description: 'user baichuan llm with spi'
+model_name: 'Baichuan2-Turbo'
+max_tokens: 1000
+api_key_name: 'BAICHUAN_API_KEY'
+api_base_name: 'BAICHUAN_API_BASE'
+metadata:
+  type: 'LLM'
+  module: 'agentuniverse.llm.default.baichuan_openai_style_llm'
+  class: 'BAICHUANOpenAIStyleLLM'
+```
+## 2. 环境设置
+### 2.1 通过python代码配置
+必须配置：BAICHUAN_API_KEY  
+可选配置：BAICHUAN_API_BASE, BAICHUAN_PROXY
+```python
+import os
+os.environ['BAICHUAN_API_KEY'] = 'sk-***'
+os.environ['BAICHUAN_PROXY'] = 'https://xxxxxx'
+```
+### 2.2 通过配置文件配置
+在项目的config目录下的custom_key.toml当中，添加配置：
+```toml
+BAICHUAN_API_KEY="sk-******"
+BAICHUAN_PROXY="https://xxxxxx"
+```
+## 3. BAICHUAN API KEY 获取
+参考 百川 官方文档：https://platform.baichuan-ai.com/console/apikey
+
+## 4. Tips
+在agentuniverse中，我们已经创建了一个name为default_baichuan_llm的llm,用户在配置BAICHUAN_API_KEY之后可以直接使用。
+
diff --git a/pyproject.toml b/pyproject.toml
index 5bb51f71..b94bda12 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
 [tool.poetry]
 name = "agentUniverse"
-version = "0.0.6"
+version = "0.0.7"
 description = "agentUniverse is a framework for developing applications powered by multi-agent base on large language model."
 
 authors = ["AntGroup <jerry.zzw@antgroup.com>"]
@@ -41,6 +41,9 @@ sphinx-rtd-theme = "^2.0.0"
 aliyun-log-python-sdk = { version = "0.8.8", optional = true}
 googleapis-common-protos = "^1.63.0"
 myst-parser = "^2.0.0"
+qianfan = "^0.3.12"
+dashscope = "^1.19.1"
+anthropic = "^0.26.0"
 
 [tool.poetry.extras]
 log_ext = ["aliyun-log-python-sdk"]
diff --git a/sample_standard_app/app/core/agent/peer_agent_case/demo_executing_agent.yaml b/sample_standard_app/app/core/agent/peer_agent_case/demo_executing_agent.yaml
index 3a2fdb6f..fa2e29f7 100644
--- a/sample_standard_app/app/core/agent/peer_agent_case/demo_executing_agent.yaml
+++ b/sample_standard_app/app/core/agent/peer_agent_case/demo_executing_agent.yaml
@@ -5,7 +5,7 @@ profile:
   prompt_version: demo_executing_agent.cn
   llm_model:
     name: 'demo_llm'
-    model_name: 'gpt-4-turbo'
+    model_name: 'gpt-4o'
     temperature: 0.4
 plan:
   planner:
diff --git a/sample_standard_app/app/core/agent/rag_agent_case/demo_multillm_agent.yaml b/sample_standard_app/app/core/agent/rag_agent_case/demo_multillm_agent.yaml
new file mode 100644
index 00000000..07a9649d
--- /dev/null
+++ b/sample_standard_app/app/core/agent/rag_agent_case/demo_multillm_agent.yaml
@@ -0,0 +1,28 @@
+info:
+  name: 'demo_multillm_agent'
+  description: 'demo multillm agent'
+profile:
+  introduction: You are the ai assistant.
+  target: Your target is to answer the user's questions
+  instruction: |
+    Begin!
+
+    The question that needs to be answered is: {input}
+  llm_model:
+    name: 'kimi_llm'
+    model_name: 'moonshot-v1-8k'
+#    name: 'baichuan_llm'
+#    model_name: 'Baichuan2-Turbo'
+#    name: 'qwen_llm'
+#    model_name: 'qwen-turbo'
+#    name: 'wenxin_llm'
+#    model_name: 'ERNIE-3.5-8K'
+plan:
+  planner:
+    name: 'rag_planner'
+action:
+  tool:
+metadata:
+  type: 'AGENT'
+  module: 'sample_standard_app.app.core.agent.rag_agent_case.demo_rag_agent'
+  class: 'DemoRagAgent'
\ No newline at end of file
diff --git a/sample_standard_app/app/core/llm/baichuan_llm.yaml b/sample_standard_app/app/core/llm/baichuan_llm.yaml
new file mode 100644
index 00000000..ee1c5a93
--- /dev/null
+++ b/sample_standard_app/app/core/llm/baichuan_llm.yaml
@@ -0,0 +1,10 @@
+name: 'baichuan_llm'
+description: 'demo baichuan llm with spi'
+model_name: 'Baichuan2-Turbo'
+max_tokens: 1000
+api_key_name: 'BAICHUAN_API_KEY'
+api_base_name: 'BAICHUAN_API_BASE'
+metadata:
+  type: 'LLM'
+  module: 'agentuniverse.llm.default.baichuan_openai_style_llm'
+  class: 'BAICHUANOpenAIStyleLLM'
\ No newline at end of file
diff --git a/sample_standard_app/app/core/llm/kimi_llm.yaml b/sample_standard_app/app/core/llm/kimi_llm.yaml
new file mode 100644
index 00000000..073b7dda
--- /dev/null
+++ b/sample_standard_app/app/core/llm/kimi_llm.yaml
@@ -0,0 +1,8 @@
+name: 'kimi_llm'
+description: 'demo kimi llm with spi'
+model_name: 'moonshot-v1-8k'
+max_tokens: 1000
+metadata:
+  type: 'LLM'
+  module: 'agentuniverse.llm.default.kimi_openai_style_llm'
+  class: 'KIMIOpenAIStyleLLM'
\ 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
new file mode 100644
index 00000000..4d2e7a88
--- /dev/null
+++ b/sample_standard_app/app/core/llm/qwen_llm.yaml
@@ -0,0 +1,8 @@
+name: 'qwen_llm'
+description: 'demo qwen llm with spi'
+model_name: 'qwen-turbo'
+max_tokens: 1000
+metadata:
+  type: 'LLM'
+  module: 'agentuniverse.llm.default.qwen_openai_style_llm'
+  class: 'QWenOpenAIStyleLLM'
\ No newline at end of file
diff --git a/sample_standard_app/app/core/llm/wenxin_llm.yaml b/sample_standard_app/app/core/llm/wenxin_llm.yaml
new file mode 100644
index 00000000..94c2fa03
--- /dev/null
+++ b/sample_standard_app/app/core/llm/wenxin_llm.yaml
@@ -0,0 +1,9 @@
+name: 'wenxin_llm'
+description: 'demo wenxin llm with spi'
+model_name: 'ERNIE-3.5-8K'
+max_tokens: 1000
+streaming: true
+metadata:
+  type: 'LLM'
+  module: 'agentuniverse.llm.default.wenxin_llm'
+  class: 'WenXinLLM'
\ No newline at end of file
diff --git a/sample_standard_app/config/config.toml b/sample_standard_app/config/config.toml
index d301bba8..a412d988 100644
--- a/sample_standard_app/config/config.toml
+++ b/sample_standard_app/config/config.toml
@@ -7,13 +7,13 @@ appname = 'demo_app'
 default = ['sample_standard_app.app.core']
 # Scan and register agent components for all paths under this list, with priority over the default.
 agent = ['sample_standard_app.app.core.agent']
-# Scan and register agent components for all paths under this list, with priority over the default.
-knowledge = ['sample_standard_app.app.core.knowledge']
 # Scan and register knowledge components for all paths under this list, with priority over the default.
-llm = ['sample_standard_app.app.core.llm']
+knowledge = ['sample_standard_app.app.core.knowledge']
 # Scan and register llm components for all paths under this list, with priority over the default.
-planner = ['sample_standard_app.app.core.planner']
+llm = ['sample_standard_app.app.core.llm']
 # Scan and register planner components for all paths under this list, with priority over the default.
+planner = ['sample_standard_app.app.core.planner']
+# Scan and register tool components for all paths under this list, with priority over the default.
 tool = ['sample_standard_app.app.core.tool']
 # Scan and register memory components for all paths under this list, with priority over the default.
 memory = ['sample_standard_app.app.core.memory']


Test patch:
diff --git a/sample_standard_app/app/test/test_wenxin_llm.py b/sample_standard_app/app/test/test_wenxin_llm.py
new file mode 100644
index 00000000..d24d465f
--- /dev/null
+++ b/sample_standard_app/app/test/test_wenxin_llm.py
@@ -0,0 +1,57 @@
+# !/usr/bin/env python3
+# -*- coding:utf-8 -*-
+
+# @Time    : 2024/5/22 16:25
+# @Author  : weizjajj 
+# @Email   : weizhongjie.wzj@antgroup.com
+# @FileName: test_wenxin_llm.py
+
+
+import asyncio
+import os
+import time
+import unittest
+
+from agentuniverse.base.agentuniverse import AgentUniverse
+from agentuniverse.llm.default.wenxin_llm import WenXinLLM
+from agentuniverse.llm.llm_manager import LLMManager
+
+
+class WenXinLLMTest(unittest.TestCase):
+    """Test cases for the reviewing agent"""
+
+    def setUp(self) -> None:
+        AgentUniverse().start(config_path='../../config/config.toml')
+
+    def test_reviewing_agent(self):
+        llm: WenXinLLM = LLMManager().get_instance_obj("default_baichuan_llm")
+        res = llm.call(
+            messages=[{"role": "user", "content": "你好"}],
+            streaming=True
+        )
+        print(res)
+        for item in res:
+            print(item)
+
+        langchain_llm = llm.as_langchain()
+        print(langchain_llm.invoke(input="你好"))
+        time.sleep(1)
+        asyncio.run(self.call_stream())
+
+    async def call_stream(self):
+        llm: WenXinLLM = LLMManager().get_instance_obj("default_qwen_llm")
+        res = await llm.acall(
+            messages=[{"role": "user", "content": "你好"}],
+            streaming=True
+        )
+        print(res)
+        async for item in res:
+            print(item)
+
+        langchain_llm = llm.as_langchain()
+        res = await langchain_llm.ainvoke(input="你好")
+        print(res)
+
+
+if __name__ == '__main__':
+    unittest.main()