{"id":28034,"date":"2025-03-10T10:39:56","date_gmt":"2025-03-10T02:39:56","guid":{"rendered":"https:\/\/www.aisharenet.com\/?p=28034"},"modified":"2025-03-10T10:39:56","modified_gmt":"2025-03-10T02:39:56","slug":"openmanus-kaiyuanjieai","status":"publish","type":"post","link":"https:\/\/www.kdjingpai.com\/en\/openmanus-kaiyuanjieai\/","title":{"rendered":"OpenManus \u5f00\u6e90\u89e3\u8bfb\uff0c\u6df1\u5165\u5256\u6790\u80cc\u540e\u7684 AI Agent \u67b6\u6784"},"content":{"rendered":"<h2>\u5f00\u7bc7\uff1aManus \u7684\u706b\u7206\u4e0e OpenManus \u7684\u7834\u5c40<\/h2>\n<p>\u6700\u8fd1\uff0cAI \u5708\u5b50\u91cc\u51fa\u4e86\u4e00\u4ef6\u5927\u4e8b\uff0c\u90a3\u5c31\u662f <a href=\"https:\/\/www.kdjingpai.com\/en\/manus\/\">Manus<\/a> AI Agent \u7684\u6a2a\u7a7a\u51fa\u4e16\u3002Manus \u4ee5\u5176\u5f3a\u5927\u7684\u529f\u80fd\u548c\u7075\u6d3b\u7684\u4f7f\u7528\u65b9\u5f0f\uff0c\u8fc5\u901f\u5438\u5f15\u4e86\u65e0\u6570\u76ee\u5149\u3002\u7b80\u5355\u6765\u8bf4\uff0cManus \u5c31\u50cf\u4e00\u4e2a\u5168\u80fd\u52a9\u624b\uff0c\u65e0\u8bba\u662f\u7f16\u7a0b\u3001\u67e5\u8d44\u6599\u3001\u5904\u7406\u6587\u4ef6\uff0c\u8fd8\u662f\u4e0a\u7f51\u51b2\u6d6a\uff0c\u5b83\u90fd\u80fd\u5e2e\u4f60\u641e\u5b9a\u3002<\/p>\n<p>\u4e0d\u8fc7\uff0c\u60f3\u7528 Manus \u53ef\u6ca1\u90a3\u4e48\u5bb9\u6613\uff0c\u5f97\u6709\u9080\u8bf7\u7801\u624d\u884c\u3002\u8fd9\u5c31\u628a\u5f88\u591a\u5f00\u53d1\u8005\u548c\u7814\u7a76\u8005\u6321\u5728\u4e86\u95e8\u5916\u3002\u6b63\u5f53\u5927\u5bb6\u4e00\u7b79\u83ab\u5c55\u7684\u65f6\u5019\uff0c\u5f00\u6e90\u793e\u533a\u51fa\u624b\u4e86\uff01MetaGPT \u56e2\u961f\u7684\u51e0\u4f4d\u5927\u4f6c@mannaandpoem\u3001@XiangJinyu\u3001@MoshiQAQ \u548c @didiforgithub\uff0c\u82b1\u4e86\u77ed\u77ed 3 \u5c0f\u65f6\uff0c\u5c31\u641e\u51fa\u4e86\u4e00\u4e2a\u53eb OpenManus \u7684\u5f00\u6e90\u9879\u76ee\u3002\u8fd9\u4e0b\u597d\u4e86\uff0c\u4e0d\u7528\u9080\u8bf7\u7801\uff0c\u4e5f\u80fd\u4f53\u9a8c Manus \u7684\u5f3a\u5927\u529f\u80fd\u4e86\uff01\u66f4\u4ee4\u4eba\u5174\u594b\u7684\u662f OpenManus \u662f\u4e00\u4e2a\u5f00\u6e90\u9879\u76ee\uff0c\u8fd9\u610f\u5473\u7740\u5927\u5bb6\u53ef\u4ee5\u6839\u636e\u81ea\u5df1\u7684\u9700\u6c42\u5bf9\u5b83\u8fdb\u884c\u4fee\u6539\u548c\u6269\u5c55\uff01<\/p>\n<p><img decoding=\"async\" title=\"OpenManus\uff1aMetaGPT \u63a8\u51fa\u7684\u5f00\u6e90\u7248 Manus-1\" src=\"https:\/\/www.kdjingpai.com\/wp-content\/uploads\/2025\/03\/7c0917ef0188c9f.png\" alt=\"OpenManus\uff1aMetaGPT \u63a8\u51fa\u7684\u5f00\u6e90\u7248 Manus-1\" \/><\/p>\n<p>OpenManus \u7684\u51fa\u73b0\uff0c\u4e0d\u4ec5\u8ba9\u66f4\u591a\u4eba\u6709\u673a\u4f1a\u4f53\u9a8c\u5230 AI Agent \u7684\u9b45\u529b\uff0c\u4e5f\u4e3a AI Agent \u7684\u53d1\u5c55\u6ce8\u5165\u4e86\u65b0\u7684\u6d3b\u529b\u3002\u5bf9\u4e8e\u54b1\u4eec\u8fd9\u4e9b\u641e\u6280\u672f\u7684\u4eba\u6765\u8bf4\uff0cOpenManus \u4e0d\u4ec5\u662f\u4e00\u4e2a\u597d\u7528\u7684\u5de5\u5177\uff0c\u66f4\u662f\u4e00\u4e2a\u7edd\u4f73\u7684\u5b66\u4e60\u8d44\u6e90\u3002\u901a\u8fc7\u7814\u7a76\u5b83\u7684\u4ee3\u7801\uff0c\u6211\u4eec\u53ef\u4ee5\u6df1\u5165\u4e86\u89e3 AI Agent \u7684\u6846\u67b6\u8bbe\u8ba1\u548c\u5b9e\u73b0\u7ec6\u8282\u3002<\/p>\n<p>&nbsp;<\/p>\n<h2>AI Agent \u6846\u67b6\uff1aOpenManus \u7684\u8bbe\u8ba1\u54f2\u5b66<\/h2>\n<p>OpenManus \u7684\u4ee3\u7801\u7ed3\u6784\u975e\u5e38\u6e05\u6670\uff0c\u91c7\u7528\u4e86\u6a21\u5757\u5316\u7684\u8bbe\u8ba1\uff0c\u5c31\u50cf\u642d\u79ef\u6728\u4e00\u6837\uff0c\u628a\u4e0d\u540c\u7684\u529f\u80fd\u6a21\u5757\u7ec4\u5408\u5728\u4e00\u8d77\u3002\u8fd9\u79cd\u8bbe\u8ba1\u7684\u597d\u5904\u662f\uff0c\u4ee3\u7801\u590d\u7528\u6027\u9ad8\u3001\u6269\u5c55\u6027\u5f3a\uff0c\u800c\u4e14\u6bcf\u4e2a\u6a21\u5757\u7684\u804c\u8d23\u90fd\u5f88\u660e\u786e\u3002<\/p>\n<p>OpenManus \u7684\u6838\u5fc3\u7ec4\u4ef6\u5305\u62ec\uff1a<\/p>\n<pre><code>OpenManus\r\n\u251c\u2500\u2500 Agent (\u4ee3\u7406\u5c42)\r\n\u2502   \u251c\u2500\u2500 BaseAgent (\u57fa\u7840\u62bd\u8c61\u7c7b)\r\n\u2502   \u251c\u2500\u2500 ReActAgent (\u601d\u8003-\u884c\u52a8\u6a21\u5f0f)\r\n\u2502   \u251c\u2500\u2500 ToolCallAgent (\u5de5\u5177\u8c03\u7528\u80fd\u529b)\r\n\u2502   \u251c\u2500\u2500 PlanningAgent (\u89c4\u5212\u80fd\u529b)\r\n\u2502   \u251c\u2500\u2500 SWEAgent (\u8f6f\u4ef6\u5de5\u7a0b\u80fd\u529b)\r\n\u2502   \u2514\u2500\u2500 Manus (\u901a\u7528\u4ee3\u7406)\r\n\u251c\u2500\u2500 LLM (\u8bed\u8a00\u6a21\u578b\u5c42)\r\n\u251c\u2500\u2500 Memory (\u8bb0\u5fc6\u5c42)\r\n\u251c\u2500\u2500 Tool (\u5de5\u5177\u5c42)\r\n\u2502   \u251c\u2500\u2500 BaseTool (\u5de5\u5177\u57fa\u7c7b)\r\n\u2502   \u251c\u2500\u2500 PlanningTool (\u89c4\u5212\u5de5\u5177)\r\n\u2502   \u251c\u2500\u2500 PythonExecute (Python \u6267\u884c)\r\n\u2502   \u251c\u2500\u2500 GoogleSearch (\u641c\u7d22\u5de5\u5177)\r\n\u2502   \u251c\u2500\u2500 BrowserUseTool (\u6d4f\u89c8\u5668\u5de5\u5177)\r\n\u2502   \u2514\u2500\u2500 ... (\u5176\u4ed6\u5de5\u5177)\r\n\u251c\u2500\u2500 Flow (\u5de5\u4f5c\u6d41\u5c42)\r\n\u2502   \u251c\u2500\u2500 BaseFlow (\u57fa\u7840\u6d41\u7a0b)\r\n\u2502   \u2514\u2500\u2500 PlanningFlow (\u89c4\u5212\u6d41\u7a0b)\r\n\u2514\u2500\u2500 Prompt (\u63d0\u793a\u8bcd\u5c42)\r\n<\/code><\/pre>\n<h3>LLM \u7ec4\u4ef6\uff1aAgent \u7684\u5927\u8111<\/h3>\n<p>\u5982\u679c\u628a Agent \u6bd4\u4f5c\u4e00\u4e2a\u4eba\uff0c\u90a3\u4e48 LLM\uff08Large Language Model\uff0c\u5927\u578b\u8bed\u8a00\u6a21\u578b\uff09\u5c31\u662f Agent \u7684\u5927\u8111\u3002\u5b83\u8d1f\u8d23\u7406\u89e3\u7528\u6237\u7684\u6307\u4ee4\uff0c\u751f\u6210\u56de\u590d\uff0c\u5e76\u505a\u51fa\u51b3\u7b56\u3002OpenManus \u901a\u8fc7 LLM \u7c7b\u6765\u5c01\u88c5\u4e0e\u8bed\u8a00\u6a21\u578b\u7684\u4ea4\u4e92\u3002<\/p>\n<pre><code>class LLM:\r\n_instances: Dict[str, \"LLM\"] = {}  # \u5355\u4f8b\u6a21\u5f0f\u5b9e\u73b0\r\ndef __init__(\r\nself, config_name: str = \"default\", llm_config: Optional[LLMSettings] = None\r\n):\r\nif not hasattr(self, \"client\"):  # \u53ea\u521d\u59cb\u5316\u4e00\u6b21\r\nllm_config = llm_config or config.llm\r\nllm_config = llm_config.get(config_name, llm_config[\"default\"])\r\nself.model = llm_config.model\r\nself.max_tokens = llm_config.max_tokens\r\nself.temperature = llm_config.temperature\r\nself.client = AsyncOpenAI(\r\napi_key=llm_config.api_key, base_url=llm_config.base_url\r\n)\r\n<\/code><\/pre>\n<p>LLM \u7c7b\u63d0\u4f9b\u4e86\u4e24\u4e2a\u6838\u5fc3\u65b9\u6cd5\uff1a<\/p>\n<ul>\n<li><code>ask<\/code>: \u53d1\u9001\u666e\u901a\u5bf9\u8bdd\u8bf7\u6c42<\/li>\n<li><code>ask_tool<\/code>: \u53d1\u9001\u5e26\u5de5\u5177\u8c03\u7528\u7684\u8bf7\u6c42<\/li>\n<\/ul>\n<pre><code>async def ask_tool(\r\nself,\r\nmessages: List[Union[dict, Message]],\r\nsystem_msgs: Optional[List[Union[dict, Message]]] = None,\r\ntimeout: int = 60,\r\ntools: Optional[List[dict]] = None,\r\ntool_choice: Literal[\"none\", \"auto\", \"required\"] = \"auto\",\r\ntemperature: Optional[float] = None,\r\n**kwargs,\r\n):\r\n# \u683c\u5f0f\u5316\u6d88\u606f\r\nif system_msgs:\r\nsystem_msgs = self.format_messages(system_msgs)\r\nmessages = system_msgs + self.format_messages(messages)\r\nelse:\r\nmessages = self.format_messages(messages)\r\n# \u53d1\u9001\u8bf7\u6c42\r\nresponse = await self.client.chat.completions.create(\r\nmodel=self.model,\r\nmessages=messages,\r\ntemperature=temperature or self.temperature,\r\nmax_tokens=self.max_tokens,\r\ntools=tools,\r\ntool_choice=tool_choice,\r\ntimeout=timeout,\r\n**kwargs,\r\n)\r\n<\/code><\/pre>\n<h3>Memory \u7ec4\u4ef6\uff1aAgent \u7684\u8bb0\u5fc6<\/h3>\n<p>Memory \u7ec4\u4ef6\u5c31\u50cf Agent \u7684\u7b14\u8bb0\u672c\uff0c\u8d1f\u8d23\u8bb0\u5f55\u548c\u7ba1\u7406 Agent \u7684\u5bf9\u8bdd\u5386\u53f2\u3002\u6709\u4e86 Memory\uff0cAgent \u624d\u80fd\u8bb0\u4f4f\u4e4b\u524d\u8bf4\u8fc7\u7684\u8bdd\uff0c\u4fdd\u6301\u5bf9\u8bdd\u7684\u8fde\u8d2f\u6027\u3002<\/p>\n<pre><code>class Memory(BaseModel):\r\n\"\"\"Stores and manages agent's conversation history.\"\"\"\r\nmessages: List[Message] = Field(default_factory=list)\r\ndef add_message(self, message: Union[Message, dict]) -&gt; None:\r\n\"\"\"Add a message to memory.\"\"\"\r\nif isinstance(message, dict):\r\nmessage = Message(**message)\r\nself.messages.append(message)\r\ndef get_messages(self) -&gt; List[Message]:\r\n\"\"\"Get all messages in memory.\"\"\"\r\nreturn self.messages\r\n<\/code><\/pre>\n<p>Memory \u7ec4\u4ef6\u662f Agent \u7684\u6838\u5fc3\u7ec4\u6210\u90e8\u5206\uff0c\u901a\u8fc7 BaseAgent \u7684\u00a0<code>update_memory<\/code>\u00a0\u65b9\u6cd5\u6dfb\u52a0\u65b0\u6d88\u606f\uff1a<\/p>\n<pre><code>def update_memory(\r\nself,\r\nrole: Literal[\"user\", \"system\", \"assistant\", \"tool\"],\r\ncontent: str,\r\n**kwargs,\r\n) -&gt; None:\r\n\"\"\"Add a message to the agent's memory.\"\"\"\r\nmessage_map = {\r\n\"user\": Message.user_message,\r\n\"system\": Message.system_message,\r\n\"assistant\": Message.assistant_message,\r\n\"tool\": lambda content, **kw: Message.tool_message(content, **kw),\r\n}\r\nif role not in message_map:\r\nraise ValueError(f\"Unsupported message role: {role}\")\r\nmsg_factory = message_map[role]\r\nmsg = msg_factory(content, **kwargs) if role == \"tool\" else msg_factory(content)\r\nself.memory.add_message(msg)\r\n<\/code><\/pre>\n<h3>Tools \u7ec4\u4ef6\uff1aAgent \u7684\u5de5\u5177\u7bb1<\/h3>\n<p>Tools \u7ec4\u4ef6\u662f Agent \u4e0e\u5916\u90e8\u4e16\u754c\u4ea4\u4e92\u7684\u6865\u6881\u3002OpenManus \u5b9e\u73b0\u4e86\u4e00\u4e2a\u7075\u6d3b\u7684\u5de5\u5177\u7cfb\u7edf\uff0c\u8ba9 Agent \u80fd\u591f\u8c03\u7528\u5404\u79cd\u5de5\u5177\u6765\u5b8c\u6210\u4efb\u52a1\u3002<\/p>\n<pre><code>class BaseTool(ABC, BaseModel):\r\nname: str\r\ndescription: str\r\nparameters: Optional[dict] = None\r\nasync def __call__(self, **kwargs) -&gt; Any:\r\n\"\"\"Execute the tool with given parameters.\"\"\"\r\nreturn await self.execute(**kwargs)\r\n    @abstractmethod\r\nasync def execute(self, **kwargs) -&gt; Any:\r\n\"\"\"Execute the tool with given parameters.\"\"\"\r\ndef to_param(self) -&gt; Dict:\r\n\"\"\"Convert tool to function call format.\"\"\"\r\nreturn {\r\n\"type\": \"function\",\r\n\"function\": {\r\n\"name\": self.name,\r\n\"description\": self.description,\r\n\"parameters\": self.parameters,\r\n},\r\n}\r\n<\/code><\/pre>\n<p>\u5de5\u5177\u7684\u6267\u884c\u7ed3\u679c\u7528\u00a0<code>ToolResult<\/code>\u00a0\u7c7b\u6765\u8868\u793a\uff1a<\/p>\n<pre><code>class ToolResult(BaseModel):\r\n\"\"\"Represents the result of a tool execution.\"\"\"\r\noutput: Any = Field(default=None)\r\nerror: Optional[str] = Field(default=None)\r\nsystem: Optional[str] = Field(default=None)\r\n<\/code><\/pre>\n<p>OpenManus \u63d0\u4f9b\u4e86\u5f88\u591a\u5185\u7f6e\u5de5\u5177\uff0c\u6bd4\u5982\u00a0<code>PlanningTool<\/code>\uff1a<\/p>\n<pre><code>class PlanningTool(BaseTool):\r\n\"\"\"\r\nA planning tool that allows the agent to create and manage plans for solving complex tasks.\r\nThe tool provides functionality for creating plans, updating plan steps, and tracking progress.\r\n\"\"\"\r\nname: str = \"planning\"\r\ndescription: str = _PLANNING_TOOL_DESCRIPTION\r\nparameters: dict = {\r\n\"type\": \"object\",\r\n\"properties\": {\r\n\"<a href=\"https:\/\/www.kdjingpai.com\/en\/cohere\/\">command<\/a>\": {\r\n\"description\": \"The command to execute. Available commands: create, update, list, get, set_active, mark_step, delete.\",\r\n\"enum\": [\r\n\"create\",\r\n\"update\",\r\n\"list\",\r\n\"get\",\r\n\"set_active\",\r\n\"mark_step\",\r\n\"delete\",\r\n],\r\n\"type\": \"string\",\r\n},\r\n# \u5176\u4ed6\u53c2\u6570...\r\n},\r\n\"required\": [\"command\"],\r\n}\r\n<\/code><\/pre>\n<h3>Planning \u7ec4\u4ef6\uff1aAgent \u7684\u89c4\u5212\u80fd\u529b<\/h3>\n<p>Planning \u7ec4\u4ef6\u662f OpenManus \u5b9e\u73b0\u590d\u6742\u4efb\u52a1\u5904\u7406\u7684\u5173\u952e\u3002\u5b83\u53ef\u4ee5\u8ba9 Agent \u5236\u5b9a\u8ba1\u5212\uff0c\u628a\u590d\u6742\u7684\u4efb\u52a1\u5206\u89e3\u6210\u4e00\u6b65\u4e00\u6b65\u7684\u5c0f\u4efb\u52a1\uff0c\u7136\u540e\u9010\u4e2a\u5b8c\u6210\u3002<\/p>\n<p>Planning \u7ec4\u4ef6\u4e3b\u8981\u5305\u62ec\u4e24\u90e8\u5206\uff1a<\/p>\n<ol>\n<li><code>PlanningTool<\/code>\uff1a\u63d0\u4f9b\u8ba1\u5212\u7684\u521b\u5efa\u3001\u66f4\u65b0\u548c\u8ddf\u8e2a\u529f\u80fd\u3002<\/li>\n<li><code>PlanningAgent<\/code>\uff1a\u4f7f\u7528\u00a0<code>PlanningTool<\/code>\u00a0\u6765\u8fdb\u884c\u4efb\u52a1\u89c4\u5212\u548c\u6267\u884c\u3002<\/li>\n<\/ol>\n<pre><code>class PlanningAgent(ToolCallAgent):\r\n\"\"\"\r\nAn agent that creates and manages plans to solve tasks.\r\nThis agent uses a planning tool to create and manage structured plans,\r\nand tracks progress through individual steps until task completion.\r\n\"\"\"\r\nname: str = \"planning\"\r\ndescription: str = \"An agent that creates and manages plans to solve tasks\"\r\nsystem_prompt: str = PLANNING_SYSTEM_PROMPT\r\nnext_step_prompt: str = NEXT_STEP_PROMPT\r\navailable_tools: ToolCollection = Field(\r\ndefault_factory=lambda: ToolCollection(PlanningTool(), Terminate())\r\n)\r\n# \u6b65\u9aa4\u6267\u884c\u8ddf\u8e2a\u5668\r\nstep_execution_tracker: Dict[str, Dict] = Field(default_factory=dict)\r\ncurrent_step_index: Optional[int] = None\r\n<\/code><\/pre>\n<p><code>PlanningAgent<\/code>\u00a0\u7684\u6838\u5fc3\u65b9\u6cd5\u5305\u62ec\uff1a<\/p>\n<pre><code>async def think(self) -&gt; bool:\r\n\"\"\"Decide the next action based on plan status.\"\"\"\r\nprompt = (\r\nf\"CURRENT PLAN STATUS:n{await self.get_plan()}nn{self.next_step_prompt}\"\r\nif self.active_plan_id\r\nelse self.next_step_prompt\r\n)\r\nself.messages.append(Message.user_message(prompt))\r\n# \u83b7\u53d6\u5f53\u524d\u6b65\u9aa4\u7d22\u5f15\r\nself.current_step_index = await self._get_current_step_index()\r\nresult = await super().think()\r\n# \u5173\u8054\u5de5\u5177\u8c03\u7528\u4e0e\u5f53\u524d\u6b65\u9aa4\r\nif result and self.tool_calls:\r\n# ...\u5173\u8054\u903b\u8f91...\r\nreturn result\r\n<\/code><\/pre>\n<h3>Flow \u7ec4\u4ef6\uff1aAgent \u7684\u534f\u4f5c\u80fd\u529b<\/h3>\n<p>Flow \u7ec4\u4ef6\u7684\u4f5c\u7528\u662f\u534f\u8c03\u591a\u4e2a Agent \u4e00\u8d77\u5de5\u4f5c\uff0c\u5b8c\u6210\u66f4\u590d\u6742\u7684\u4efb\u52a1\u3002<\/p>\n<pre><code>class BaseFlow(BaseModel, ABC):\r\n\"\"\"Base class for execution flows supporting multiple agents\"\"\"\r\nagents: Dict[str, BaseAgent]\r\ntools: Optional[List] = None\r\nprimary_agent_key: Optional[str] = None\r\n    @property\r\ndef primary_agent(self) -&gt; Optional[BaseAgent]:\r\n\"\"\"Get the primary agent for the flow\"\"\"\r\nreturn self.agents.get(self.primary_agent_key)\r\n    @abstractmethod\r\nasync def execute(self, input_text: str) -&gt; str:\r\n\"\"\"Execute the flow with given input\"\"\"\r\n<\/code><\/pre>\n<p><code>PlanningFlow<\/code>\u00a0\u662f\u4e00\u4e2a\u5177\u4f53\u7684 Flow \u5b9e\u73b0\uff0c\u7528\u4e8e\u89c4\u5212\u548c\u6267\u884c\u4efb\u52a1\uff1a<\/p>\n<pre><code>class PlanningFlow(BaseFlow):\r\n\"\"\"A flow that manages planning and execution of tasks using agents.\"\"\"\r\nllm: LLM = Field(default_factory=lambda: LLM())\r\nplanning_tool: PlanningTool = Field(default_factory=PlanningTool)\r\nexecutor_keys: List[str] = Field(default_factory=list)\r\nactive_plan_id: str = Field(default_factory=lambda: f\"plan_{int(time.time())}\")\r\ncurrent_step_index: Optional[int] = None\r\nasync def execute(self, input_text: str) -&gt; str:\r\n\"\"\"Execute the planning flow with agents.\"\"\"\r\ntry:\r\n# \u521b\u5efa\u521d\u59cb\u8ba1\u5212\r\nif input_text:\r\nawait self._create_initial_plan(input_text)\r\n# \u6267\u884c\u8ba1\u5212\u6b65\u9aa4\r\nwhile await self._has_next_step():\r\n# \u83b7\u53d6\u5f53\u524d\u6b65\u9aa4\r\nstep_info = await self._get_current_step()\r\n# \u9009\u62e9\u5408\u9002\u7684\u6267\u884c\u8005\r\nexecutor = self.get_executor(step_info.get(\"type\"))\r\n# \u6267\u884c\u6b65\u9aa4\r\nresult = await self._execute_step(executor, step_info)\r\n# \u66f4\u65b0\u6b65\u9aa4\u72b6\u6001\r\nawait self._update_step_status(step_info[\"index\"], \"completed\")\r\n# \u5b8c\u6210\u8ba1\u5212\r\nreturn await self._finalize_plan()\r\nexcept Exception as e:\r\n# \u5904\u7406\u5f02\u5e38\r\nreturn f\"Error executing flow: {str(e)}\"\r\n<\/code><\/pre>\n<h2>OpenManus \u7684 Agent \u5b9e\u73b0\uff1a\u5206\u5c42\u67b6\u6784<\/h2>\n<p>OpenManus \u7684 Agent \u91c7\u7528\u5c42\u6b21\u5316\u67b6\u6784\uff0c\u4ece\u57fa\u7840\u529f\u80fd\u5230\u4e13\u4e1a\u5e94\u7528\u9010\u5c42\u6784\u5efa\u3002\u8fd9\u79cd\u8bbe\u8ba1\u7684\u597d\u5904\u662f\uff0c\u4ee3\u7801\u590d\u7528\u6027\u9ad8\u3001\u6269\u5c55\u6027\u5f3a\uff0c\u800c\u4e14\u6bcf\u4e2a\u5c42\u6b21\u7684\u804c\u8d23\u90fd\u5f88\u660e\u786e\u3002<\/p>\n<pre><code>BaseAgent (\u62bd\u8c61\u57fa\u7c7b)\r\n\u2514\u2500\u2500 ReActAgent (\u601d\u8003-\u884c\u52a8\u6a21\u5f0f)\r\n\u2514\u2500\u2500 ToolCallAgent (\u5de5\u5177\u8c03\u7528\u80fd\u529b)\r\n\u251c\u2500\u2500 PlanningAgent (\u89c4\u5212\u80fd\u529b)\r\n\u251c\u2500\u2500 SWEAgent (\u8f6f\u4ef6\u5de5\u7a0b\u80fd\u529b)\r\n\u2514\u2500\u2500 Manus (\u901a\u7528\u4ee3\u7406)\r\n<\/code><\/pre>\n<h3>BaseAgent\uff1a\u57fa\u7840\u4e2d\u7684\u57fa\u7840<\/h3>\n<p><code>BaseAgent<\/code>\u00a0\u662f\u6574\u4e2a\u6846\u67b6\u7684\u57fa\u7840\uff0c\u5b83\u5b9a\u4e49\u4e86 Agent \u7684\u6838\u5fc3\u5c5e\u6027\u548c\u65b9\u6cd5\uff1a<\/p>\n<pre><code>class BaseAgent(BaseModel, ABC):\r\n\"\"\"Abstract base class for managing agent state and execution.\"\"\"\r\n# \u6838\u5fc3\u5c5e\u6027\r\nname: str = Field(..., description=\"Unique name of the agent\")\r\ndescription: Optional[str] = Field(None, description=\"Optional agent description\")\r\n# \u63d0\u793a\u8bcd\r\nsystem_prompt: Optional[str] = Field(None, description=\"System-level instruction prompt\")\r\nnext_step_prompt: Optional[str] = Field(None, description=\"Prompt for determining next action\")\r\n# \u4f9d\u8d56\u7ec4\u4ef6\r\nllm: LLM = Field(default_factory=LLM, description=\"Language model instance\")\r\nmemory: Memory = Field(default_factory=Memory, description=\"Agent's memory store\")\r\nstate: AgentState = Field(default=AgentState.IDLE, description=\"Current agent state\")\r\n# \u6267\u884c\u63a7\u5236\r\nmax_steps: int = Field(default=10, description=\"Maximum steps before termination\")\r\ncurrent_step: int = Field(default=0, description=\"Current step in execution\")\r\n<\/code><\/pre>\n<h3>ReActAgent\uff1a\u4f1a\u601d\u8003\u7684 Agent<\/h3>\n<p><code>ReActAgent<\/code>\u00a0\u5b9e\u73b0\u4e86\u201c\u601d\u8003-\u884c\u52a8\u201d\u6a21\u5f0f\uff0c\u628a Agent \u7684\u6267\u884c\u8fc7\u7a0b\u5206\u4e3a\u4e24\u4e2a\u9636\u6bb5\uff1a<\/p>\n<pre><code>class ReActAgent(BaseAgent, ABC):\r\n    @abstractmethod\r\nasync def think(self) -&gt; bool:\r\n\"\"\"Process current state and decide next action\"\"\"\r\n    @abstractmethod\r\nasync def act(self) -&gt; str:\r\n\"\"\"Execute decided actions\"\"\"\r\nasync def step(self) -&gt; str:\r\n\"\"\"Execute a single step: think and act.\"\"\"\r\nshould_act = await self.think()\r\nif not should_act:\r\nreturn \"Thinking complete - no action needed\"\r\nreturn await self.act()\r\n<\/code><\/pre>\n<h3>ToolCallAgent\uff1a\u80fd\u7528\u5de5\u5177\u7684 Agent<\/h3>\n<p><code>ToolCallAgent<\/code>\u00a0\u7ed9 Agent \u589e\u52a0\u4e86\u4f7f\u7528\u5de5\u5177\u7684\u80fd\u529b\uff1a<\/p>\n<pre><code>class ToolCallAgent(ReActAgent):\r\n\"\"\"Base agent class for handling tool\/function calls with enhanced abstraction\"\"\"\r\navailable_tools: ToolCollection = ToolCollection(\r\nCreateChatCompletion(), Terminate()\r\n)\r\ntool_choices: Literal[\"none\", \"auto\", \"required\"] = \"auto\"\r\nasync def think(self) -&gt; bool:\r\n# \u83b7\u53d6 LLM \u54cd\u5e94\u548c\u5de5\u5177\u9009\u62e9\r\nresponse = await self.llm.ask_tool(\r\nmessages=self.messages,\r\nsystem_msgs=[Message.system_message(self.system_prompt)]\r\nif self.system_prompt\r\nelse None,\r\ntools=self.available_tools.to_params(),\r\ntool_choice=self.tool_choices,\r\n)\r\nself.tool_calls = response.tool_calls\r\n# \u5904\u7406\u54cd\u5e94\u548c\u5de5\u5177\u8c03\u7528\r\n# ...\r\nasync def act(self) -&gt; str:\r\n# \u6267\u884c\u5de5\u5177\u8c03\u7528\r\nresults = []\r\nfor command in self.tool_calls:\r\nresult = await self.execute_tool(command)\r\n# \u6dfb\u52a0\u5de5\u5177\u54cd\u5e94\u5230\u5185\u5b58\r\n# ...\r\nresults.append(result)\r\nreturn \"nn\".join(results)\r\n<\/code><\/pre>\n<h3>PlanningAgent\uff1a\u4f1a\u505a\u8ba1\u5212\u7684 Agent<\/h3>\n<p><code>PlanningAgent<\/code>\u00a0\u5b9e\u73b0\u4e86\u4efb\u52a1\u89c4\u5212\u548c\u6267\u884c\u8ddf\u8e2a\uff1a<\/p>\n<pre><code>class PlanningAgent(ToolCallAgent):\r\n\"\"\"\r\nAn agent that creates and manages plans to solve tasks.\r\nThis agent uses a planning tool to create and manage structured plans,\r\nand tracks progress through individual steps until task completion.\r\n\"\"\"\r\n# \u6b65\u9aa4\u6267\u884c\u8ddf\u8e2a\u5668\r\nstep_execution_tracker: Dict[str, Dict] = Field(default_factory=dict)\r\ncurrent_step_index: Optional[int] = None\r\nasync def think(self) -&gt; bool:\r\n\"\"\"Decide the next action based on plan status.\"\"\"\r\nprompt = (\r\nf\"CURRENT PLAN STATUS:n{await self.get_plan()}nn{self.next_step_prompt}\"\r\nif self.active_plan_id\r\nelse self.next_step_prompt\r\n)\r\nself.messages.append(Message.user_message(prompt))\r\n# \u83b7\u53d6\u5f53\u524d\u6b65\u9aa4\u7d22\u5f15\r\nself.current_step_index = await self._get_current_step_index()\r\nresult = await super().think()\r\n# \u5173\u8054\u5de5\u5177\u8c03\u7528\u4e0e\u5f53\u524d\u6b65\u9aa4\r\nif result and self.tool_calls:\r\n# ...\u5173\u8054\u903b\u8f91...\r\nreturn result\r\n<\/code><\/pre>\n<h3>Manus\uff1a\u5168\u80fd Agent<\/h3>\n<p><code>Manus<\/code>\u00a0\u662f OpenManus \u7684\u6838\u5fc3 Agent\uff0c\u5b83\u96c6\u6210\u4e86\u5404\u79cd\u5de5\u5177\u548c\u80fd\u529b\uff0c\u53ef\u4ee5\u5904\u7406\u5404\u79cd\u5404\u6837\u7684\u4efb\u52a1\uff1a<\/p>\n<pre><code>class Manus(ToolCallAgent):\r\n\"\"\"\r\nA versatile general-purpose agent that uses planning to solve various tasks.\r\nThis agent extends PlanningAgent with a comprehensive set of tools and capabilities,\r\nincluding Python execution, web browsing, file operations, and information <a href=\"https:\/\/www.kdjingpai.com\/en\/retrieval\/\">retrieval<\/a>\r\nto handle a wide range of user requests.\r\n\"\"\"\r\nname: str = \"manus\"\r\ndescription: str = \"A versatile general-purpose agent\"\r\nsystem_prompt: str = SYSTEM_PROMPT\r\nnext_step_prompt: str = NEXT_STEP_PROMPT\r\navailable_tools: ToolCollection = Field(\r\ndefault_factory=lambda: ToolCollection(\r\nPythonExecute(), GoogleSearch(), BrowserUseTool(), FileSaver(), Terminate()\r\n)\r\n)\r\n<\/code><\/pre>\n<h2>Prompt\uff1aAgent \u7684\u884c\u4e3a\u6307\u5357<\/h2>\n<p>Prompt \u5728\u6784\u5efa Agent \u7cfb\u7edf\u4e2d\u8d77\u7740\u81f3\u5173\u91cd\u8981\u7684\u4f5c\u7528\uff0c\u5b83\u5c31\u50cf\u4e00\u4efd\u8bf4\u660e\u4e66\uff0c\u544a\u8bc9 Agent \u5e94\u8be5\u5982\u4f55\u884c\u52a8\u3002<\/p>\n<h3>\u7cfb\u7edf Prompt\uff1a\u5b9a\u4e49 Agent \u7684\u89d2\u8272<\/h3>\n<p>\u7cfb\u7edf Prompt \u7ed9 Agent \u8bbe\u5b9a\u4e86\u57fa\u672c\u7684\u89d2\u8272\u548c\u884c\u4e3a\u51c6\u5219\uff1a<\/p>\n<pre><code>SYSTEM_PROMPT = \"You are OpenManus, an all-capable AI assistant, aimed at solving any task presented by the user. You have various tools at your disposal that you can call upon to efficiently complete complex requests. Whether it's programming, information retrieval, file processing, or web browsing, you can handle it all.\"\r\n<\/code><\/pre>\n<p>\u8fd9\u4e2a Prompt \u544a\u8bc9 Agent\uff0c\u5b83\u662f\u4e00\u4e2a\u5168\u80fd\u7684 AI \u52a9\u624b\uff0c\u53ef\u4ee5\u5229\u7528\u5404\u79cd\u5de5\u5177\u6765\u5b8c\u6210\u7528\u6237\u7684\u8bf7\u6c42\u3002<\/p>\n<h3>\u89c4\u5212 Prompt\uff1a\u6307\u5bfc Agent \u505a\u8ba1\u5212<\/h3>\n<p>\u89c4\u5212 Prompt \u544a\u8bc9 Agent \u5982\u4f55\u628a\u590d\u6742\u7684\u4efb\u52a1\u5206\u89e3\u6210\u5c0f\u4efb\u52a1\uff0c\u5e76\u5236\u5b9a\u6267\u884c\u8ba1\u5212\uff1a<\/p>\n<pre><code>PLANNING_SYSTEM_PROMPT = \"\"\"\r\nYou are an expert Planning Agent tasked with solving complex problems by creating and managing structured plans.\r\nYour job is:\r\n1. Analyze requests to understand the task scope\r\n2. Create clear, actionable plans with the `planning` tool\r\n3. Execute steps using available tools as needed\r\n4. Track progress and adapt plans dynamically\r\n5. Use `finish` to conclude when the task is complete\r\nAvailable tools will vary by task but may include:\r\n- `planning`: Create, update, and track plans (commands: create, update, mark_step, etc.)\r\n- `finish`: End the task when complete\r\nBreak tasks into logical, sequential steps. Think about dependencies and verification methods.\r\n\"\"\"\r\n<\/code><\/pre>\n<p>\u8fd9\u4e2a Prompt \u544a\u8bc9 Agent\uff0c\u5b83\u662f\u4e00\u4e2a\u89c4\u5212\u4e13\u5bb6\uff0c\u9700\u8981\u4f7f\u7528\u00a0<code>planning<\/code>\u00a0\u5de5\u5177\u6765\u521b\u5efa\u3001\u66f4\u65b0\u548c\u8ddf\u8e2a\u8ba1\u5212\u3002<\/p>\n<h3>\u5de5\u5177\u4f7f\u7528 Prompt\uff1a\u544a\u8bc9 Agent \u600e\u4e48\u7528\u5de5\u5177<\/h3>\n<p>\u5de5\u5177\u4f7f\u7528 Prompt \u8be6\u7ec6\u4ecb\u7ecd\u4e86\u6bcf\u4e2a\u5de5\u5177\u7684\u529f\u80fd\u548c\u4f7f\u7528\u573a\u666f\uff0c\u5e2e\u52a9 Agent \u9009\u62e9\u5408\u9002\u7684\u5de5\u5177\uff1a<\/p>\n<pre><code>NEXT_STEP_PROMPT = \"\"\"You can interact with the <a href=\"https:\/\/www.kdjingpai.com\/en\/tldraw-computer\/\">computer<\/a> using PythonExecute, save important content and information files through FileSaver, open browsers with BrowserUseTool, and retrieve information using GoogleSearch.\r\nPythonExecute: Execute Python code to interact with the computer system, data processing, automation tasks, etc.\r\nFileSaver: Save files locally, such as txt, py, html, etc.\r\nBrowserUseTool: Open, <a href=\"https:\/\/www.kdjingpai.com\/en\/browse-aiwudaiai\/\">browse<\/a>, and use web browsers.If you open a local HTML file, you must provide the absolute path to the file.\r\nGoogleSearch: Perform web information retrieval\r\nBased on user needs, proactively select the most appropriate tool or combination of tools. For complex tasks, you can break down the problem and use different tools step by step to solve it. After using each tool, clearly explain the execution results and suggest the next steps.\r\n\"\"\"\r\n<\/code><\/pre>\n<h3>\u52a8\u6001 Prompt\uff1a\u8ba9 Agent \u66f4\u7075\u6d3b<\/h3>\n<p>OpenManus \u7684 Prompt \u4e0d\u4ec5\u53ef\u4ee5\u662f\u9759\u6001\u7684\uff0c\u8fd8\u53ef\u4ee5\u52a8\u6001\u751f\u6210\u3002\u6bd4\u5982\uff0c\u5728\u00a0<code>PlanningAgent<\/code>\u00a0\u4e2d\uff0c\u7cfb\u7edf\u4f1a\u628a\u5f53\u524d\u7684\u8ba1\u5212\u72b6\u6001\u6dfb\u52a0\u5230 Prompt \u4e2d\uff1a<\/p>\n<pre><code>async def think(self) -&gt; bool:\r\n\"\"\"Decide the next action based on plan status.\"\"\"\r\nprompt = (\r\nf\"CURRENT PLAN STATUS:n{await self.get_plan()}nn{self.next_step_prompt}\"\r\nif self.active_plan_id\r\nelse self.next_step_prompt\r\n)\r\nself.messages.append(Message.user_message(prompt))\r\n<\/code><\/pre>\n<p>\u8fd9\u79cd\u52a8\u6001 Prompt \u8ba9 Agent \u80fd\u591f\u6839\u636e\u5f53\u524d\u7684\u60c5\u51b5\u505a\u51fa\u66f4\u5408\u7406\u7684\u51b3\u7b56\u3002<\/p>\n<p>&nbsp;<\/p>\n<h2>\u603b\u7ed3\uff1aOpenManus \u7684\u542f\u793a<\/h2>\n<p>\u901a\u8fc7\u5bf9 OpenManus \u4ee3\u7801\u7684\u5206\u6790\uff0c\u6211\u4eec\u53ef\u4ee5\u603b\u7ed3\u51fa AI Agent \u6846\u67b6\u7684\u51e0\u4e2a\u5173\u952e\u7ec4\u6210\u90e8\u5206\uff1a<\/p>\n<ol>\n<li><strong>Agent<\/strong>\uff1a\u4ece\u57fa\u7840\u5230\u4e13\u4e1a\u7684\u5c42\u6b21\u5316\u8bbe\u8ba1\uff0c\u5b9e\u73b0\u4e0d\u540c\u7ea7\u522b\u7684\u80fd\u529b\u3002\n<ul>\n<li><code>BaseAgent<\/code>\uff1a\u63d0\u4f9b\u57fa\u7840\u7684\u72b6\u6001\u7ba1\u7406\u548c\u6267\u884c\u5faa\u73af\u3002<\/li>\n<li><code>ReActAgent<\/code>\uff1a\u5b9e\u73b0\u601d\u8003-\u884c\u52a8\u6a21\u5f0f\u3002<\/li>\n<li><code>ToolCallAgent<\/code>\uff1a\u6dfb\u52a0\u5de5\u5177\u8c03\u7528\u80fd\u529b\u3002<\/li>\n<li>\u4e13\u4e1a Agent\uff1a\u5982\u00a0<code>PlanningAgent<\/code>\u3001<code>SWEAgent<\/code>\u00a0\u548c\u00a0<code>Manus<\/code>\u3002<\/li>\n<\/ul>\n<\/li>\n<li><strong>LLM<\/strong>\uff1a\u5c01\u88c5\u4e0e\u5927\u578b\u8bed\u8a00\u6a21\u578b\u7684\u4ea4\u4e92\uff0c\u63d0\u4f9b\u5bf9\u8bdd\u548c\u5de5\u5177\u8c03\u7528\u80fd\u529b\u3002\n<ul>\n<li>\u652f\u6301\u666e\u901a\u5bf9\u8bdd\u548c\u5de5\u5177\u8c03\u7528\u3002<\/li>\n<li>\u5b9e\u73b0\u91cd\u8bd5\u673a\u5236\u548c\u9519\u8bef\u5904\u7406\u3002<\/li>\n<li>\u652f\u6301\u6d41\u5f0f\u54cd\u5e94\u3002<\/li>\n<\/ul>\n<\/li>\n<li><strong>Memory<\/strong>\uff1a\u7ba1\u7406\u5bf9\u8bdd\u5386\u53f2\u548c\u4e0a\u4e0b\u6587\u3002\n<ul>\n<li>\u5b58\u50a8\u548c\u68c0\u7d22\u6d88\u606f\u3002<\/li>\n<li>\u7ef4\u62a4\u5bf9\u8bdd\u4e0a\u4e0b\u6587\u3002<\/li>\n<\/ul>\n<\/li>\n<li><strong>Tool<\/strong>\uff1a\u63d0\u4f9b\u4e0e\u5916\u90e8\u4e16\u754c\u4ea4\u4e92\u7684\u63a5\u53e3\u3002\n<ul>\n<li>\u57fa\u7840\u5de5\u5177\u62bd\u8c61\u3002<\/li>\n<li>\u591a\u79cd\u4e13\u4e1a\u5de5\u5177\u5b9e\u73b0\u3002<\/li>\n<li>\u5de5\u5177\u7ed3\u679c\u5904\u7406\u3002<\/li>\n<\/ul>\n<\/li>\n<li><strong>Planning<\/strong>\uff1a\u5b9e\u73b0\u4efb\u52a1\u89c4\u5212\u548c\u6267\u884c\u8ddf\u8e2a\u3002\n<ul>\n<li>\u8ba1\u5212\u521b\u5efa\u548c\u7ba1\u7406\u3002<\/li>\n<li>\u6b65\u9aa4\u72b6\u6001\u8ddf\u8e2a\u3002<\/li>\n<li>\u52a8\u6001\u8c03\u6574\u8ba1\u5212\u3002<\/li>\n<\/ul>\n<\/li>\n<li><strong>Flow<\/strong>\uff1a\u7ba1\u7406\u591a\u4e2a Agent \u7684\u534f\u4f5c\u3002\n<ul>\n<li>\u4efb\u52a1\u5206\u914d\u3002<\/li>\n<li>\u7ed3\u679c\u6574\u5408\u3002<\/li>\n<li>\u6d41\u7a0b\u63a7\u5236\u3002<\/li>\n<\/ul>\n<\/li>\n<li><strong>Prompt<\/strong>\uff1a\u6307\u5bfc Agent \u7684\u884c\u4e3a\u548c\u51b3\u7b56\u3002\n<ul>\n<li>\u7cfb\u7edf Prompt \u5b9a\u4e49\u89d2\u8272\u3002<\/li>\n<li>\u4e13\u4e1a Prompt \u6307\u5bfc\u51b3\u7b56\u3002<\/li>\n<li>\u52a8\u6001 Prompt \u751f\u6210\u3002<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<p>OpenManus \u7684\u8bbe\u8ba1\u601d\u8def\u6e05\u6670\uff0c\u4ee3\u7801\u7ed3\u6784\u5408\u7406\uff0c\u662f\u4e00\u4e2a\u5b66\u4e60 AI Agent \u5b9e\u73b0\u7684\u4f18\u79c0\u8303\u4f8b\u3002\u5b83\u7684\u6a21\u5757\u5316\u8bbe\u8ba1\u4f7f\u5f97\u5f00\u53d1\u8005\u53ef\u4ee5\u8f7b\u677e\u6269\u5c55\u548c\u5b9a\u5236\u81ea\u5df1\u7684\u4ee3\u7406\u3002<\/p>\n<p>\u5bf9\u4e8e\u60f3\u8981\u6df1\u5165\u4e86\u89e3 AI Agent \u6216\u6784\u5efa\u81ea\u5df1\u7684 Agent \u7cfb\u7edf\u7684\u5f00\u53d1\u8005\u6765\u8bf4\uff0cOpenManus \u63d0\u4f9b\u4e86\u4e00\u4e2a\u5f88\u597d\u7684\u8d77\u70b9\u3002\u901a\u8fc7\u5b66\u4e60\u5b83\u7684\u67b6\u6784\u548c\u5b9e\u73b0\uff0c\u6211\u4eec\u53ef\u4ee5\u66f4\u597d\u5730\u7406\u89e3 AI Agent \u7684\u5de5\u4f5c\u539f\u7406\u548c\u8bbe\u8ba1\u601d\u8def\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u5f00\u7bc7\uff1aManus \u7684\u706b\u7206\u4e0e OpenManus \u7684\u7834\u5c40 \u6700\u8fd1\uff0cAI \u5708\u5b50\u91cc\u51fa\u4e86\u4e00\u4ef6\u5927\u4e8b\uff0c\u90a3\u5c31\u662f Manus AI Agent \u7684\u6a2a\u7a7a\u51fa\u4e16\u3002Manus \u4ee5\u5176\u5f3a\u5927\u7684\u529f\u80fd\u548c\u7075\u6d3b\u7684\u4f7f\u7528\u65b9\u5f0f\uff0c\u8fc5\u901f\u5438\u5f15\u4e86\u65e0\u6570\u76ee\u5149\u3002\u7b80\u5355\u6765\u8bf4\uff0cManus \u5c31\u50cf\u4e00\u4e2a\u5168\u80fd\u52a9\u624b&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[182],"tags":[],"class_list":["post-28034","post","type-post","status-publish","format-standard","hentry","category-shicao"],"_links":{"self":[{"href":"https:\/\/www.kdjingpai.com\/en\/wp-json\/wp\/v2\/posts\/28034","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.kdjingpai.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.kdjingpai.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.kdjingpai.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.kdjingpai.com\/en\/wp-json\/wp\/v2\/comments?post=28034"}],"version-history":[{"count":0,"href":"https:\/\/www.kdjingpai.com\/en\/wp-json\/wp\/v2\/posts\/28034\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.kdjingpai.com\/en\/wp-json\/wp\/v2\/media?parent=28034"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.kdjingpai.com\/en\/wp-json\/wp\/v2\/categories?post=28034"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.kdjingpai.com\/en\/wp-json\/wp\/v2\/tags?post=28034"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}