[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"similar-InternLM--lagent":3,"tool-InternLM--lagent":61},[4,18,26,36,44,53],{"id":5,"name":6,"github_repo":7,"description_zh":8,"stars":9,"difficulty_score":10,"last_commit_at":11,"category_tags":12,"status":17},4358,"openclaw","openclaw\u002Fopenclaw","OpenClaw 是一款专为个人打造的本地化 AI 助手，旨在让你在自己的设备上拥有完全可控的智能伙伴。它打破了传统 AI 助手局限于特定网页或应用的束缚，能够直接接入你日常使用的各类通讯渠道，包括微信、WhatsApp、Telegram、Discord、iMessage 等数十种平台。无论你在哪个聊天软件中发送消息，OpenClaw 都能即时响应，甚至支持在 macOS、iOS 和 Android 设备上进行语音交互，并提供实时的画布渲染功能供你操控。\n\n这款工具主要解决了用户对数据隐私、响应速度以及“始终在线”体验的需求。通过将 AI 部署在本地，用户无需依赖云端服务即可享受快速、私密的智能辅助，真正实现了“你的数据，你做主”。其独特的技术亮点在于强大的网关架构，将控制平面与核心助手分离，确保跨平台通信的流畅性与扩展性。\n\nOpenClaw 非常适合希望构建个性化工作流的技术爱好者、开发者，以及注重隐私保护且不愿被单一生态绑定的普通用户。只要具备基础的终端操作能力（支持 macOS、Linux 及 Windows WSL2），即可通过简单的命令行引导完成部署。如果你渴望拥有一个懂你",349277,3,"2026-04-06T06:32:30",[13,14,15,16],"Agent","开发框架","图像","数据工具","ready",{"id":19,"name":20,"github_repo":21,"description_zh":22,"stars":23,"difficulty_score":10,"last_commit_at":24,"category_tags":25,"status":17},3808,"stable-diffusion-webui","AUTOMATIC1111\u002Fstable-diffusion-webui","stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面，旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点，将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。\n\n无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师，还是想要深入探索模型潜力的开发者与研究人员，都能从中获益。其核心亮点在于极高的功能丰富度：不仅支持文生图、图生图、局部重绘（Inpainting）和外绘（Outpainting）等基础模式，还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外，它内置了 GFPGAN 和 CodeFormer 等人脸修复工具，支持多种神经网络放大算法，并允许用户通过插件系统无限扩展能力。即使是显存有限的设备，stable-diffusion-webui 也提供了相应的优化选项，让高质量的 AI 艺术创作变得触手可及。",162132,"2026-04-05T11:01:52",[14,15,13],{"id":27,"name":28,"github_repo":29,"description_zh":30,"stars":31,"difficulty_score":32,"last_commit_at":33,"category_tags":34,"status":17},1381,"everything-claude-code","affaan-m\u002Feverything-claude-code","everything-claude-code 是一套专为 AI 编程助手（如 Claude Code、Codex、Cursor 等）打造的高性能优化系统。它不仅仅是一组配置文件，而是一个经过长期实战打磨的完整框架，旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。\n\n通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能，everything-claude-code 能显著提升 AI 在复杂任务中的表现，帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略，使得模型响应更快、成本更低，同时有效防御潜在的攻击向量。\n\n这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库，还是需要 AI 协助进行安全审计与自动化测试，everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目，它融合了多语言支持与丰富的实战钩子（hooks），让 AI 真正成长为懂上",144730,2,"2026-04-07T23:26:32",[14,13,35],"语言模型",{"id":37,"name":38,"github_repo":39,"description_zh":40,"stars":41,"difficulty_score":32,"last_commit_at":42,"category_tags":43,"status":17},2271,"ComfyUI","Comfy-Org\u002FComfyUI","ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎，专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式，采用直观的节点式流程图界面，让用户通过连接不同的功能模块即可构建个性化的生成管线。\n\n这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景，也能自由组合模型、调整参数并实时预览效果，轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性，不仅支持 Windows、macOS 和 Linux 全平台，还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构，并率先支持 SDXL、Flux、SD3 等前沿模型。\n\n无论是希望深入探索算法潜力的研究人员和开发者，还是追求极致创作自由度的设计师与资深 AI 绘画爱好者，ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能，使其成为当前最灵活、生态最丰富的开源扩散模型工具之一，帮助用户将创意高效转化为现实。",107888,"2026-04-06T11:32:50",[14,15,13],{"id":45,"name":46,"github_repo":47,"description_zh":48,"stars":49,"difficulty_score":32,"last_commit_at":50,"category_tags":51,"status":17},4721,"markitdown","microsoft\u002Fmarkitdown","MarkItDown 是一款由微软 AutoGen 团队打造的轻量级 Python 工具，专为将各类文件高效转换为 Markdown 格式而设计。它支持 PDF、Word、Excel、PPT、图片（含 OCR）、音频（含语音转录）、HTML 乃至 YouTube 链接等多种格式的解析，能够精准提取文档中的标题、列表、表格和链接等关键结构信息。\n\n在人工智能应用日益普及的今天，大语言模型（LLM）虽擅长处理文本，却难以直接读取复杂的二进制办公文档。MarkItDown 恰好解决了这一痛点，它将非结构化或半结构化的文件转化为模型“原生理解”且 Token 效率极高的 Markdown 格式，成为连接本地文件与 AI 分析 pipeline 的理想桥梁。此外，它还提供了 MCP（模型上下文协议）服务器，可无缝集成到 Claude Desktop 等 LLM 应用中。\n\n这款工具特别适合开发者、数据科学家及 AI 研究人员使用，尤其是那些需要构建文档检索增强生成（RAG）系统、进行批量文本分析或希望让 AI 助手直接“阅读”本地文件的用户。虽然生成的内容也具备一定可读性，但其核心优势在于为机器",93400,"2026-04-06T19:52:38",[52,14],"插件",{"id":54,"name":55,"github_repo":56,"description_zh":57,"stars":58,"difficulty_score":10,"last_commit_at":59,"category_tags":60,"status":17},4487,"LLMs-from-scratch","rasbt\u002FLLMs-from-scratch","LLMs-from-scratch 是一个基于 PyTorch 的开源教育项目，旨在引导用户从零开始一步步构建一个类似 ChatGPT 的大型语言模型（LLM）。它不仅是同名技术著作的官方代码库，更提供了一套完整的实践方案，涵盖模型开发、预训练及微调的全过程。\n\n该项目主要解决了大模型领域“黑盒化”的学习痛点。许多开发者虽能调用现成模型，却难以深入理解其内部架构与训练机制。通过亲手编写每一行核心代码，用户能够透彻掌握 Transformer 架构、注意力机制等关键原理，从而真正理解大模型是如何“思考”的。此外，项目还包含了加载大型预训练权重进行微调的代码，帮助用户将理论知识延伸至实际应用。\n\nLLMs-from-scratch 特别适合希望深入底层原理的 AI 开发者、研究人员以及计算机专业的学生。对于不满足于仅使用 API，而是渴望探究模型构建细节的技术人员而言，这是极佳的学习资源。其独特的技术亮点在于“循序渐进”的教学设计：将复杂的系统工程拆解为清晰的步骤，配合详细的图表与示例，让构建一个虽小但功能完备的大模型变得触手可及。无论你是想夯实理论基础，还是为未来研发更大规模的模型做准备",90106,"2026-04-06T11:19:32",[35,15,13,14],{"id":62,"github_repo":63,"name":64,"description_en":65,"description_zh":66,"ai_summary_zh":66,"readme_en":67,"readme_zh":68,"quickstart_zh":69,"use_case_zh":70,"hero_image_url":71,"owner_login":72,"owner_name":72,"owner_avatar_url":73,"owner_bio":74,"owner_company":75,"owner_location":75,"owner_email":76,"owner_twitter":77,"owner_website":78,"owner_url":79,"languages":80,"stars":85,"forks":86,"last_commit_at":87,"license":88,"difficulty_score":32,"env_os":89,"env_gpu":90,"env_ram":89,"env_deps":91,"category_tags":97,"github_topics":98,"view_count":32,"oss_zip_url":75,"oss_zip_packed_at":75,"status":17,"created_at":103,"updated_at":104,"faqs":105,"releases":136},5332,"InternLM\u002Flagent","lagent","A lightweight framework for building LLM-based agents","lagent 是一个轻量级开源框架，专为构建基于大语言模型（LLM）的智能体而设计。它旨在解决开发者在搭建多智能体应用时面临的流程复杂、代码耦合度高等痛点，让构建过程像搭积木一样简单直观。\n\n该工具特别适合 AI 开发者、研究人员以及希望快速原型化智能体应用的工程师使用。普通用户若无需定制开发，则较难直接从中获益。\n\nlagent 最大的技术亮点在于其深受 PyTorch 设计理念启发。它将智能体的各个功能模块抽象为“层”，用户只需以地道的 Python 方式定义这些层及其之间的消息传递逻辑，即可清晰地把控工作流。框架内置了标准化的 `AgentMessage` 通信机制和自动化的记忆管理模块，每次交互会自动记录上下文状态，同时也支持灵活的记忆清除与导出。此外，它还允许用户自定义消息聚合策略，为构建复杂的多智能体协作系统提供了极高的自由度与扩展性。通过 lagent，你可以专注于业务逻辑创新，而非底层架构的重复造轮子。","\u003Cdiv id=\"top\">\u003C\u002Fdiv>\n\u003Cdiv align=\"center\">\n  \u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FInternLM_lagent_readme_a836233c5e66.png\" width=\"450\"\u002F>\n\n[![docs](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fdocs-latest-blue)](https:\u002F\u002Flagent.readthedocs.io\u002Fen\u002Flatest\u002F)\n[![PyPI](https:\u002F\u002Fimg.shields.io\u002Fpypi\u002Fv\u002Flagent)](https:\u002F\u002Fpypi.org\u002Fproject\u002Flagent)\n[![license](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Flicense\u002FInternLM\u002Flagent.svg)](https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Ftree\u002Fmain\u002FLICENSE)\n[![issue resolution](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fissues-closed-raw\u002FInternLM\u002Flagent)](https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fissues)\n[![open issues](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fissues-raw\u002FInternLM\u002Flagent)](https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fissues)\n![Visitors](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FInternLM_lagent_readme_8b52f570a2cc.png)\n![GitHub forks](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fforks\u002FInternLM\u002Flagent)\n![GitHub Repo stars](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fstars\u002FInternLM\u002Flagent)\n![GitHub contributors](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fcontributors\u002FInternLM\u002Flagent)\n\n\u003C\u002Fdiv>\n\n\u003Cp align=\"center\">\n    👋 join us on \u003Ca href=\"https:\u002F\u002Ftwitter.com\u002Fintern_lm\" target=\"_blank\">𝕏 (Twitter)\u003C\u002Fa>, \u003Ca href=\"https:\u002F\u002Fdiscord.gg\u002Fxa29JuW87d\" target=\"_blank\">Discord\u003C\u002Fa> and \u003Ca href=\"https:\u002F\u002Fr.vansin.top\u002F?r=internwx\" target=\"_blank\">WeChat\u003C\u002Fa>\n\u003C\u002Fp>\n\n## Installation\n\nInstall from source:\n\n```bash\ngit clone https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent.git\ncd lagent\npip install -e .\n```\n\n## Usage\n\nLagent is inspired by the design philosophy of PyTorch. We expect that the analogy of neural network layers will make the workflow clearer and more intuitive, so users only need to focus on creating layers and defining message passing between them in a Pythonic way. This is a simple tutorial to get you quickly started with building multi-agent applications.\n\n### Models as Agents\n\nAgents use `AgentMessage` for communication.\n\n```python\nfrom typing import Dict, List\nfrom lagent.agents import Agent\nfrom lagent.schema import AgentMessage\nfrom lagent.llms import VllmModel, INTERNLM2_META\n\nllm = VllmModel(\n    path='Qwen\u002FQwen2-7B-Instruct',\n    meta_template=INTERNLM2_META,\n    tp=1,\n    top_k=1,\n    temperature=1.0,\n    stop_words=['\u003C|im_end|>'],\n    max_new_tokens=1024,\n)\nsystem_prompt = '你的回答只能从“典”、“孝”、“急”三个字中选一个。'\nagent = Agent(llm, system_prompt)\n\nuser_msg = AgentMessage(sender='user', content='今天天气情况')\nbot_msg = agent(user_msg)\nprint(bot_msg)\n```\n\n```\ncontent='急' sender='Agent' formatted=None extra_info=None type=None receiver=None stream_state=\u003CAgentStatusCode.END: 0>\n```\n\n### Memory as State\n\nBoth input and output messages will be added to the memory of `Agent` in each forward pass. This is performed in `__call__` rather than `forward`. See the following pseudo code\n\n```python\n    def __call__(self, *message):\n        message = pre_hooks(message)\n        add_memory(message)\n        message = self.forward(*message)\n        add_memory(message)\n        message = post_hooks(message)\n        return message\n```\n\nInspect the memory in two ways\n\n```python\nmemory: List[AgentMessage] = agent.memory.get_memory()\nprint(memory)\nprint('-' * 120)\ndumped_memory: Dict[str, List[dict]] = agent.state_dict()\nprint(dumped_memory['memory'])\n```\n\n```\n[AgentMessage(content='今天天气情况', sender='user', formatted=None, extra_info=None, type=None, receiver=None, stream_state=\u003CAgentStatusCode.END: 0>), AgentMessage(content='急', sender='Agent', formatted=None, extra_info=None, type=None, receiver=None, stream_state=\u003CAgentStatusCode.END: 0>)]\n------------------------------------------------------------------------------------------------------------------------\n[{'content': '今天天气情况', 'sender': 'user', 'formatted': None, 'extra_info': None, 'type': None, 'receiver': None, 'stream_state': \u003CAgentStatusCode.END: 0>}, {'content': '急', 'sender': 'Agent', 'formatted': None, 'extra_info': None, 'type': None, 'receiver': None, 'stream_state': \u003CAgentStatusCode.END: 0>}]\n```\n\nClear the memory of this session(`session_id=0` by default):\n\n```python\nagent.reset()\n```\n\n### Custom Message Aggregation\n\n`DefaultAggregator` is called under the hood to assemble and convert `AgentMessage` to OpenAI message format.\n\n```python\n    def forward(self, *message: AgentMessage, session_id=0, **kwargs) -> Union[AgentMessage, str]:\n        formatted_messages = self.aggregator.aggregate(\n            self.memory.get(session_id),\n            self.name,\n            self.output_format,\n            self.template,\n        )\n        llm_response = self.llm.chat(formatted_messages, **kwargs)\n        ...\n```\n\nImplement a simple aggregator that can receive few-shots\n\n```python\nfrom typing import List, Union\nfrom lagent.memory import Memory\nfrom lagent.prompts import StrParser\nfrom lagent.agents.aggregator import DefaultAggregator\n\nclass FewshotAggregator(DefaultAggregator):\n    def __init__(self, few_shot: List[dict] = None):\n        self.few_shot = few_shot or []\n\n    def aggregate(self,\n                  messages: Memory,\n                  name: str,\n                  parser: StrParser = None,\n                  system_instruction: Union[str, dict, List[dict]] = None) -> List[dict]:\n        _message = []\n        if system_instruction:\n            _message.extend(\n                self.aggregate_system_intruction(system_instruction))\n        _message.extend(self.few_shot)\n        messages = messages.get_memory()\n        for message in messages:\n            if message.sender == name:\n                _message.append(\n                    dict(role='assistant', content=str(message.content)))\n            else:\n                user_message = message.content\n                if len(_message) > 0 and _message[-1]['role'] == 'user':\n                    _message[-1]['content'] += user_message\n                else:\n                    _message.append(dict(role='user', content=user_message))\n        return _message\n\nagent = Agent(\n    llm,\n    aggregator=FewshotAggregator(\n        [\n            {\"role\": \"user\", \"content\": \"今天天气\"},\n            {\"role\": \"assistant\", \"content\": \"【晴】\"},\n        ]\n    )\n)\nuser_msg = AgentMessage(sender='user', content='昨天天气')\nbot_msg = agent(user_msg)\nprint(bot_msg)\n```\n\n```\ncontent='【多云转晴，夜间有轻微降温】' sender='Agent' formatted=None extra_info=None type=None receiver=None stream_state=\u003CAgentStatusCode.END: 0>\n```\n\n### Flexible Response Formatting\n\nIn `AgentMessage`, `formatted` is reserved to store information parsed by `output_format` from the model output.\n\n```python\n    def forward(self, *message: AgentMessage, session_id=0, **kwargs) -> Union[AgentMessage, str]:\n        ...\n        llm_response = self.llm.chat(formatted_messages, **kwargs)\n        if self.output_format:\n            formatted_messages = self.output_format.parse_response(llm_response)\n            return AgentMessage(\n                sender=self.name,\n                content=llm_response,\n                formatted=formatted_messages,\n            )\n        ...\n```\n\nUse a tool parser as follows\n\n````python\nfrom lagent.prompts.parsers import ToolParser\n\nsystem_prompt = \"逐步分析并编写Python代码解决以下问题。\"\nparser = ToolParser(tool_type='code interpreter', begin='```python\\n', end='\\n```\\n')\nllm.gen_params['stop_words'].append('\\n```\\n')\nagent = Agent(llm, system_prompt, output_format=parser)\n\nuser_msg = AgentMessage(\n    sender='user',\n    content='Marie is thinking of a multiple of 63, while Jay is thinking of a '\n    'factor of 63. They happen to be thinking of the same number. There are '\n    'two possibilities for the number that each of them is thinking of, one '\n    'positive and one negative. Find the product of these two numbers.')\nbot_msg = agent(user_msg)\nprint(bot_msg.model_dump_json(indent=4))\n````\n\n````\n{\n    \"content\": \"首先，我们需要找出63的所有正因数和负因数。63的正因数可以通过分解63的质因数来找出，即\\\\(63 = 3^2 \\\\times 7\\\\)。因此，63的正因数包括1, 3, 7, 9, 21, 和 63。对于负因数，我们只需将上述正因数乘以-1。\\n\\n接下来，我们需要找出与63的正因数相乘的结果为63的数，以及与63的负因数相乘的结果为63的数。这可以通过将63除以每个正因数和负因数来实现。\\n\\n最后，我们将找到的两个数相乘得到最终答案。\\n\\n下面是Python代码实现：\\n\\n```python\\ndef find_numbers():\\n    # 正因数\\n    positive_factors = [1, 3, 7, 9, 21, 63]\\n    # 负因数\\n    negative_factors = [-1, -3, -7, -9, -21, -63]\\n    \\n    # 找到与正因数相乘的结果为63的数\\n    positive_numbers = [63 \u002F factor for factor in positive_factors]\\n    # 找到与负因数相乘的结果为63的数\\n    negative_numbers = [-63 \u002F factor for factor in negative_factors]\\n    \\n    # 计算两个数的乘积\\n    product = positive_numbers[0] * negative_numbers[0]\\n    \\n    return product\\n\\nresult = find_numbers()\\nprint(result)\",\n    \"sender\": \"Agent\",\n    \"formatted\": {\n        \"tool_type\": \"code interpreter\",\n        \"thought\": \"首先，我们需要找出63的所有正因数和负因数。63的正因数可以通过分解63的质因数来找出，即\\\\(63 = 3^2 \\\\times 7\\\\)。因此，63的正因数包括1, 3, 7, 9, 21, 和 63。对于负因数，我们只需将上述正因数乘以-1。\\n\\n接下来，我们需要找出与63的正因数相乘的结果为63的数，以及与63的负因数相乘的结果为63的数。这可以通过将63除以每个正因数和负因数来实现。\\n\\n最后，我们将找到的两个数相乘得到最终答案。\\n\\n下面是Python代码实现：\\n\\n\",\n        \"action\": \"def find_numbers():\\n    # 正因数\\n    positive_factors = [1, 3, 7, 9, 21, 63]\\n    # 负因数\\n    negative_factors = [-1, -3, -7, -9, -21, -63]\\n    \\n    # 找到与正因数相乘的结果为63的数\\n    positive_numbers = [63 \u002F factor for factor in positive_factors]\\n    # 找到与负因数相乘的结果为63的数\\n    negative_numbers = [-63 \u002F factor for factor in negative_factors]\\n    \\n    # 计算两个数的乘积\\n    product = positive_numbers[0] * negative_numbers[0]\\n    \\n    return product\\n\\nresult = find_numbers()\\nprint(result)\",\n        \"status\": 1\n    },\n    \"extra_info\": null,\n    \"type\": null,\n    \"receiver\": null,\n    \"stream_state\": 0\n}\n````\n\n### Consistency of Tool Calling\n\n`ActionExecutor` uses the same communication data structure as `Agent`, but requires the content of input `AgentMessage` to be a dict containing:\n\n- `name`: tool name, e.g. `'IPythonInterpreter'`, `'WebBrowser.search'`.\n- `parameters`: keyword arguments of the tool API, e.g. `{'command': 'import math;math.sqrt(2)'}`, `{'query': ['recent progress in AI']}`.\n\nYou can register custom hooks for message conversion.\n\n```python\nfrom lagent.hooks import Hook\nfrom lagent.schema import ActionReturn, ActionStatusCode, AgentMessage\nfrom lagent.actions import ActionExecutor, IPythonInteractive\n\nclass CodeProcessor(Hook):\n    def before_action(self, executor, message, session_id):\n        message = message.copy(deep=True)\n        message.content = dict(\n            name='IPythonInteractive', parameters={'command': message.formatted['action']}\n        )\n        return message\n\n    def after_action(self, executor, message, session_id):\n        action_return = message.content\n        if isinstance(action_return, ActionReturn):\n            if action_return.state == ActionStatusCode.SUCCESS:\n                response = action_return.format_result()\n            else:\n                response = action_return.errmsg\n        else:\n            response = action_return\n        message.content = response\n        return message\n\nexecutor = ActionExecutor(actions=[IPythonInteractive()], hooks=[CodeProcessor()])\nbot_msg = AgentMessage(\n    sender='Agent',\n    content='首先，我们需要...',\n    formatted={\n        'tool_type': 'code interpreter',\n        'thought': '首先，我们需要...',\n        'action': 'def find_numbers():\\n    # 正因数\\n    positive_factors = [1, 3, 7, 9, 21, 63]\\n    # 负因数\\n    negative_factors = [-1, -3, -7, -9, -21, -63]\\n    \\n    # 找到与正因数相乘的结果为63的数\\n    positive_numbers = [63 \u002F factor for factor in positive_factors]\\n    # 找到与负因数相乘的结果为63的数\\n    negative_numbers = [-63 \u002F factor for factor in negative_factors]\\n    \\n    # 计算两个数的乘积\\n    product = positive_numbers[0] * negative_numbers[0]\\n    \\n    return product\\n\\nresult = find_numbers()\\nprint(result)',\n        'status': 1\n    })\nexecutor_msg = executor(bot_msg)\nprint(executor_msg)\n```\n\n```\ncontent='3969.0' sender='ActionExecutor' formatted=None extra_info=None type=None receiver=None stream_state=\u003CAgentStatusCode.END: 0>\n```\n\n**For convenience, Lagent provides `InternLMActionProcessor` which is adapted to messages formatted by `ToolParser` as mentioned above.**\n\n### Dual Interfaces\n\nLagent adopts dual interface design, where almost every component(LLMs, actions, action executors...) has the corresponding asynchronous variant by prefixing its identifier with 'Async'. It is recommended to use synchronous agents for debugging and asynchronous ones for large-scale inference to make the most of idle CPU and GPU resources.\n\nHowever, make sure the internal consistency of agents, i.e. asynchronous agents should be equipped with asynchronous LLMs and asynchronous action executors that drive asynchronous tools.\n\n```python\nfrom lagent.llms import VllmModel, AsyncVllmModel, LMDeployPipeline, AsyncLMDeployPipeline\nfrom lagent.actions import ActionExecutor, AsyncActionExecutor, WebBrowser, AsyncWebBrowser\nfrom lagent.agents import Agent, AsyncAgent, AgentForInternLM, AsyncAgentForInternLM\n```\n\n______________________________________________________________________\n\n## Practice\n\n- **Try to implement `forward` instead of `__call__` of subclasses unless necessary.**\n- **Always include the `session_id` argument explicitly, which is designed for isolation of memory, LLM requests and tool invocation(e.g. maintain multiple independent IPython environments) in concurrency.**\n\n### Single Agent\n\nMath agents that solve problems by programming\n\n````python\nfrom lagent.agents.aggregator import InternLMToolAggregator\n\nclass Coder(Agent):\n    def __init__(self, model_path, system_prompt, max_turn=3):\n        super().__init__()\n        llm = VllmModel(\n            path=model_path,\n            meta_template=INTERNLM2_META,\n            tp=1,\n            top_k=1,\n            temperature=1.0,\n            stop_words=['\\n```\\n', '\u003C|im_end|>'],\n            max_new_tokens=1024,\n        )\n        self.agent = Agent(\n            llm,\n            system_prompt,\n            output_format=ToolParser(\n                tool_type='code interpreter', begin='```python\\n', end='\\n```\\n'\n            ),\n            # `InternLMToolAggregator` is adapted to `ToolParser` for aggregating\n            # messages with tool invocations and execution results\n            aggregator=InternLMToolAggregator(),\n        )\n        self.executor = ActionExecutor([IPythonInteractive()], hooks=[CodeProcessor()])\n        self.max_turn = max_turn\n\n    def forward(self, message: AgentMessage, session_id=0) -> AgentMessage:\n        for _ in range(self.max_turn):\n            message = self.agent(message, session_id=session_id)\n            if message.formatted['tool_type'] is None:\n                return message\n            message = self.executor(message, session_id=session_id)\n        return message\n\ncoder = Coder('Qwen\u002FQwen2-7B-Instruct', 'Solve the problem step by step with assistance of Python code')\nquery = AgentMessage(\n    sender='user',\n    content='Find the projection of $\\\\mathbf{a}$ onto $\\\\mathbf{b} = '\n    '\\\\begin{pmatrix} 1 \\\\\\\\ -3 \\\\end{pmatrix}$ if $\\\\mathbf{a} \\\\cdot \\\\mathbf{b} = 2.$'\n)\nanswer = coder(query)\nprint(answer.content)\nprint('-' * 120)\nfor msg in coder.state_dict()['agent.memory']:\n    print('*' * 80)\n    print(f'{msg[\"sender\"]}:\\n\\n{msg[\"content\"]}')\n````\n\n### Multiple Agents\n\nAsynchronous blogging agents that improve writing quality by self-refinement ([original AutoGen example](https:\u002F\u002Fmicrosoft.github.io\u002Fautogen\u002F0.2\u002Fdocs\u002Ftopics\u002Fprompting-and-reasoning\u002Freflection\u002F))\n\n```python\nimport asyncio\nimport os\nfrom lagent.llms import AsyncGPTAPI\nfrom lagent.agents import AsyncAgent\nos.environ['OPENAI_API_KEY'] = 'YOUR_API_KEY'\n\nclass PrefixedMessageHook(Hook):\n    def __init__(self, prefix: str, senders: list = None):\n        self.prefix = prefix\n        self.senders = senders or []\n\n    def before_agent(self, agent, messages, session_id):\n        for message in messages:\n            if message.sender in self.senders:\n                message.content = self.prefix + message.content\n\nclass AsyncBlogger(AsyncAgent):\n    def __init__(self, model_path, writer_prompt, critic_prompt, critic_prefix='', max_turn=3):\n        super().__init__()\n        llm = AsyncGPTAPI(model_type=model_path, retry=5, max_new_tokens=2048)\n        self.writer = AsyncAgent(llm, writer_prompt, name='writer')\n        self.critic = AsyncAgent(\n            llm, critic_prompt, name='critic', hooks=[PrefixedMessageHook(critic_prefix, ['writer'])]\n        )\n        self.max_turn = max_turn\n\n    async def forward(self, message: AgentMessage, session_id=0) -> AgentMessage:\n        for _ in range(self.max_turn):\n            message = await self.writer(message, session_id=session_id)\n            message = await self.critic(message, session_id=session_id)\n        return await self.writer(message, session_id=session_id)\n\nblogger = AsyncBlogger(\n    'gpt-4o-2024-05-13',\n    writer_prompt=\"You are an writing assistant tasked to write engaging blogpost. You try to generate the best blogpost possible for the user's request. \"\n    \"If the user provides critique, then respond with a revised version of your previous attempts\",\n    critic_prompt=\"Generate critique and recommendations on the writing. Provide detailed recommendations, including requests for length, depth, style, etc..\",\n    critic_prefix='Reflect and provide critique on the following writing. \\n\\n',\n)\nuser_prompt = (\n    \"Write an engaging blogpost on the recent updates in {topic}. \"\n    \"The blogpost should be engaging and understandable for general audience. \"\n    \"Should have more than 3 paragraphes but no longer than 1000 words.\")\nbot_msgs = asyncio.get_event_loop().run_until_complete(\n    asyncio.gather(\n        *[\n            blogger(AgentMessage(sender='user', content=user_prompt.format(topic=topic)), session_id=i)\n            for i, topic in enumerate(['AI', 'Biotechnology', 'New Energy', 'Video Games', 'Pop Music'])\n        ]\n    )\n)\nprint(bot_msgs[0].content)\nprint('-' * 120)\nfor msg in blogger.state_dict(session_id=0)['writer.memory']:\n    print('*' * 80)\n    print(f'{msg[\"sender\"]}:\\n\\n{msg[\"content\"]}')\nprint('-' * 120)\nfor msg in blogger.state_dict(session_id=0)['critic.memory']:\n    print('*' * 80)\n    print(f'{msg[\"sender\"]}:\\n\\n{msg[\"content\"]}')\n```\n\nA multi-agent workflow that performs information retrieval, data collection and chart plotting ([original LangGraph example](https:\u002F\u002Fvijaykumarkartha.medium.com\u002Fmultiple-ai-agents-creating-multi-agent-workflows-using-langgraph-and-langchain-0587406ec4e6))\n\n\u003Cdiv align=\"center\">\n    \u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FInternLM_lagent_readme_ef7a746f6a28.jpeg\" width=\"850\" \u002F>\n\u003C\u002Fdiv>\n\n````python\nimport json\nfrom lagent.actions import IPythonInterpreter, WebBrowser, ActionExecutor\nfrom lagent.agents.stream import get_plugin_prompt\nfrom lagent.llms import GPTAPI\nfrom lagent.hooks import InternLMActionProcessor\n\nTOOL_TEMPLATE = (\n    \"You are a helpful AI assistant, collaborating with other assistants. Use the provided tools to progress\"\n    \" towards answering the question. If you are unable to fully answer, that's OK, another assistant with\"\n    \" different tools will help where you left off. Execute what you can to make progress. If you or any of\"\n    \" the other assistants have the final answer or deliverable, prefix your response with {finish_pattern}\"\n    \" so the team knows to stop. You have access to the following tools:\\n{tool_description}\\nPlease provide\"\n    \" your thought process when you need to use a tool, followed by the call statement in this format:\"\n    \"\\n{invocation_format}\\\\\\\\n**{system_prompt}**\"\n)\n\nclass DataVisualizer(Agent):\n    def __init__(self, model_path, research_prompt, chart_prompt, finish_pattern=\"Final Answer\", max_turn=10):\n        super().__init__()\n        llm = GPTAPI(model_path, key='YOUR_OPENAI_API_KEY', retry=5, max_new_tokens=1024, stop_words=[\"```\\n\"])\n        interpreter, browser = IPythonInterpreter(), WebBrowser(\"BingSearch\", api_key=\"YOUR_BING_API_KEY\")\n        self.researcher = Agent(\n            llm,\n            TOOL_TEMPLATE.format(\n                finish_pattern=finish_pattern,\n                tool_description=get_plugin_prompt(browser),\n                invocation_format='```json\\n{\"name\": {{tool name}}, \"parameters\": {{keyword arguments}}}\\n```\\n',\n                system_prompt=research_prompt,\n            ),\n            output_format=ToolParser(\n                \"browser\",\n                begin=\"```json\\n\",\n                end=\"\\n```\\n\",\n                validate=lambda x: json.loads(x.rstrip('`')),\n            ),\n            aggregator=InternLMToolAggregator(),\n            name=\"researcher\",\n        )\n        self.charter = Agent(\n            llm,\n            TOOL_TEMPLATE.format(\n                finish_pattern=finish_pattern,\n                tool_description=interpreter.name,\n                invocation_format='```python\\n{{code}}\\n```\\n',\n                system_prompt=chart_prompt,\n            ),\n            output_format=ToolParser(\n                \"interpreter\",\n                begin=\"```python\\n\",\n                end=\"\\n```\\n\",\n                validate=lambda x: x.rstrip('`'),\n            ),\n            aggregator=InternLMToolAggregator(),\n            name=\"charter\",\n        )\n        self.executor = ActionExecutor([interpreter, browser], hooks=[InternLMActionProcessor()])\n        self.finish_pattern = finish_pattern\n        self.max_turn = max_turn\n\n    def forward(self, message, session_id=0):\n        for _ in range(self.max_turn):\n            message = self.researcher(message, session_id=session_id, stop_words=[\"```\\n\", \"```python\"]) # override llm stop words\n            while message.formatted[\"tool_type\"]:\n                message = self.executor(message, session_id=session_id)\n                message = self.researcher(message, session_id=session_id, stop_words=[\"```\\n\", \"```python\"])\n            if self.finish_pattern in message.content:\n                return message\n            message = self.charter(message)\n            while message.formatted[\"tool_type\"]:\n                message = self.executor(message, session_id=session_id)\n                message = self.charter(message, session_id=session_id)\n            if self.finish_pattern in message.content:\n                return message\n        return message\n\nvisualizer = DataVisualizer(\n    \"gpt-4o-2024-05-13\",\n    research_prompt=\"You should provide accurate data for the chart generator to use.\",\n    chart_prompt=\"Any charts you display will be visible by the user.\",\n)\nuser_msg = AgentMessage(\n    sender='user',\n    content=\"Fetch the China's GDP over the past 5 years, then draw a line graph of it. Once you code it up, finish.\")\nbot_msg = visualizer(user_msg)\nprint(bot_msg.content)\njson.dump(visualizer.state_dict(), open('visualizer.json', 'w'), ensure_ascii=False, indent=4)\n````\n\n## Citation\n\nIf you find this project useful in your research, please consider cite:\n\n```latex\n@misc{lagent2023,\n    title={{Lagent: InternLM} a lightweight open-source framework that allows users to efficiently build large language model(LLM)-based agents},\n    author={Lagent Developer Team},\n    howpublished = {\\url{https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent}},\n    year={2023}\n}\n```\n\n## License\n\nThis project is released under the [Apache 2.0 license](LICENSE).\n\n\u003Cp align=\"right\">\u003Ca href=\"#top\">🔼 Back to top\u003C\u002Fa>\u003C\u002Fp>\n","\u003Cdiv id=\"top\">\u003C\u002Fdiv>\n\u003Cdiv align=\"center\">\n  \u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FInternLM_lagent_readme_a836233c5e66.png\" width=\"450\"\u002F>\n\n[![文档](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fdocs-latest-blue)](https:\u002F\u002Flagent.readthedocs.io\u002Fen\u002Flatest\u002F)\n[![PyPI](https:\u002F\u002Fimg.shields.io\u002Fpypi\u002Fv\u002Flagent)](https:\u002F\u002Fpypi.org\u002Fproject\u002Flagent)\n[![许可证](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Flicense\u002FInternLM\u002Flagent.svg)](https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Ftree\u002Fmain\u002FLICENSE)\n[![问题解决数](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fissues-closed-raw\u002FInternLM\u002Flagent)](https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fissues)\n[![未解决问题数](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fissues-raw\u002FInternLM\u002Flagent)](https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fissues)\n![访问量](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FInternLM_lagent_readme_8b52f570a2cc.png)\n![GitHub 分支数](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fforks\u002FInternLM\u002Flagent)\n![GitHub 星标数](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fstars\u002FInternLM\u002Flagent)\n![GitHub 贡献者数](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fcontributors\u002FInternLM\u002Flagent)\n\n\u003C\u002Fdiv>\n\n\u003Cp align=\"center\">\n    👋 欢迎加入我们的 \u003Ca href=\"https:\u002F\u002Ftwitter.com\u002Fintern_lm\" target=\"_blank\">𝕏 (Twitter)\u003C\u002Fa>、\u003Ca href=\"https:\u002F\u002Fdiscord.gg\u002Fxa29JuW87d\" target=\"_blank\">Discord\u003C\u002Fa> 和 \u003Ca href=\"https:\u002F\u002Fr.vansin.top\u002F?r=internwx\" target=\"_blank\">WeChat\u003C\u002Fa>\n\u003C\u002Fp>\n\n## 安装\n\n从源码安装：\n\n```bash\ngit clone https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent.git\ncd lagent\npip install -e .\n```\n\n## 使用\n\nLagent 的设计理念受到 PyTorch 的启发。我们希望通过类比神经网络层的方式来使工作流程更加清晰直观，这样用户只需专注于以 Pythonic 的方式创建层，并定义它们之间的消息传递。以下是一个简单的教程，帮助你快速上手构建多智能体应用。\n\n### 模型作为智能体\n\n智能体使用 `AgentMessage` 进行通信。\n\n```python\nfrom typing import Dict, List\nfrom lagent.agents import Agent\nfrom lagent.schema import AgentMessage\nfrom lagent.llms import VllmModel, INTERNLM2_META\n\nllm = VllmModel(\n    path='Qwen\u002FQwen2-7B-Instruct',\n    meta_template=INTERNLM2_META,\n    tp=1,\n    top_k=1,\n    temperature=1.0,\n    stop_words=['\u003C|im_end|>'],\n    max_new_tokens=1024,\n)\nsystem_prompt = '你的回答只能从“典”、“孝”、“急”三个字中选一个。'\nagent = Agent(llm, system_prompt)\n\nuser_msg = AgentMessage(sender='user', content='今天天气情况')\nbot_msg = agent(user_msg)\nprint(bot_msg)\n```\n\n```\ncontent='急' sender='Agent' formatted=None extra_info=None type=None receiver=None stream_state=\u003CAgentStatusCode.END: 0>\n```\n\n### 内存作为状态\n\n每次前向传播时，输入和输出的消息都会被添加到 `Agent` 的内存中。这一操作是在 `__call__` 方法中完成的，而不是在 `forward` 方法中。以下是伪代码示例：\n\n```python\n    def __call__(self, *message):\n        message = pre_hooks(message)\n        add_memory(message)\n        message = self.forward(*message)\n        add_memory(message)\n        message = post_hooks(message)\n        return message\n```\n\n可以通过两种方式检查内存：\n\n```python\nmemory: List[AgentMessage] = agent.memory.get_memory()\nprint(memory)\nprint('-' * 120)\ndumped_memory: Dict[str, List[dict]] = agent.state_dict()\nprint(dumped_memory['memory'])\n```\n\n```\n[AgentMessage(content='今天天气情况', sender='user', formatted=None, extra_info=None, type=None, receiver=None, stream_state=\u003CAgentStatusCode.END: 0>), AgentMessage(content='急', sender='Agent', formatted=None, extra_info=None, type=None, receiver=None, stream_state=\u003CAgentStatusCode.END: 0>)]\n------------------------------------------------------------------------------------------------------------------------\n[{'content': '今天天气情况', 'sender': 'user', 'formatted': None, 'extra_info': None, 'type': None, 'receiver': None, 'stream_state': \u003CAgentStatusCode.END: 0>}, {'content': '急', 'sender': 'Agent', 'formatted': None, 'extra_info': None, 'type': None, 'receiver': None, 'stream_state': \u003CAgentStatusCode.END: 0>}]\n```\n\n清除当前会话的内存（默认会话 ID 为 0）：\n\n```python\nagent.reset()\n```\n\n### 自定义消息聚合\n\n后台会调用 `DefaultAggregator` 将 `AgentMessage` 组装并转换为 OpenAI 的消息格式。\n\n```python\n    def forward(self, *message: AgentMessage, session_id=0, **kwargs) -> Union[AgentMessage, str]:\n        formatted_messages = self.aggregator.aggregate(\n            self.memory.get(session_id),\n            self.name,\n            self.output_format,\n            self.template,\n        )\n        llm_response = self.llm.chat(formatted_messages, **kwargs)\n        ...\n```\n\n实现一个可以接收少量示例的简单聚合器：\n\n```python\nfrom typing import List, Union\nfrom lagent.memory import Memory\nfrom lagent.prompts import StrParser\nfrom lagent.agents.aggregator import DefaultAggregator\n\nclass FewshotAggregator(DefaultAggregator):\n    def __init__(self, few_shot: List[dict] = None):\n        self.few_shot = few_shot or []\n\n    def aggregate(self,\n                  messages: Memory,\n                  name: str,\n                  parser: StrParser = None,\n                  system_instruction: Union[str, dict, List[dict]] = None) -> List[dict]:\n        _message = []\n        if system_instruction:\n            _message.extend(\n                self.aggregate_system_intruction(system_instruction))\n        _message.extend(self.few_shot)\n        messages = messages.get_memory()\n        for message in messages:\n            if message.sender == name:\n                _message.append(\n                    dict(role='assistant', content=str(message.content)))\n            else:\n                user_message = message.content\n                if len(_message) > 0 and _message[-1]['role'] == 'user':\n                    _message[-1]['content'] += user_message\n                else:\n                    _message.append(dict(role='user', content=user_message))\n        return _message\n\nagent = Agent(\n    llm,\n    aggregator=FewshotAggregator(\n        [\n            {\"role\": \"user\", \"content\": \"今天天气\"},\n            {\"role\": \"assistant\", \"content\": \"【晴】\"},\n        ]\n    )\n)\nuser_msg = AgentMessage(sender='user', content='昨天天气')\nbot_msg = agent(user_msg)\nprint(bot_msg)\n```\n\n```\ncontent='【多云转晴，夜间有轻微降温】' sender='Agent' formatted=None extra_info=None type=None receiver=None stream_state=\u003CAgentStatusCode.END: 0>\n```\n\n### 灵活的响应格式化\n\n在 `AgentMessage` 中，`formatted` 被保留用于存储由 `output_format` 从模型输出中解析出的信息。\n\n```python\n    def forward(self, *message: AgentMessage, session_id=0, **kwargs) -> Union[AgentMessage, str]:\n        ...\n        llm_response = self.llm.chat(formatted_messages, **kwargs)\n        if self.output_format:\n            formatted_messages = self.output_format.parse_response(llm_response)\n            return AgentMessage(\n                sender=self.name,\n                content=llm_response,\n                formatted=formatted_messages,\n            )\n        ...\n```\n\n可以使用工具解析器如下：\n\n````python\nfrom lagent.prompts.parsers import ToolParser\n\nsystem_prompt = \"逐步分析并编写Python代码解决以下问题。\"\nparser = ToolParser(tool_type='code interpreter', begin='```python\\n', end='\\n```\\n')\nllm.gen_params['stop_words'].append('\\n```\\n')\nagent = Agent(llm, system_prompt, output_format=parser)\n\nuser_msg = AgentMessage(\n    sender='user',\n    content='Marie is thinking of a multiple of 63, while Jay is thinking of a '\n    'factor of 63. They happen to be thinking of the same number. There are '\n    'two possibilities for the number that each of them is thinking of, one '\n    'positive and one negative. Find the product of these two numbers.')\nbot_msg = agent(user_msg)\nprint(bot_msg.model_dump_json(indent=4))\n````\n\n````\n{\n    \"content\": \"首先，我们需要找出63的所有正因数和负因数。63的正因数可以通过分解63的质因数来找出，即\\\\(63 = 3^2 \\\\times 7\\\\)。因此，63的正因数包括1, 3, 7, 9, 21, 和 63。对于负因数，我们只需将上述正因数乘以-1。\\n\\n接下来，我们需要找出与63的正因数相乘的结果为63的数，以及与63的负因数相乘的结果为63的数。这可以通过将63除以每个正因数和负因数来实现。\\n\\n最后，我们将找到的两个数相乘得到最终答案。\\n\\n下面是Python代码实现：\\n\\n```python\\ndef find_numbers():\\n    # 正因数\\n    positive_factors = [1, 3, 7, 9, 21, 63]\\n    # 负因数\\n    negative_factors = [-1, -3, -7, -9, -21, -63]\\n    \\n    # 找到与正因数相乘的结果为63的数\\n    positive_numbers = [63 \u002F factor for factor in positive_factors]\\n    # 找到与负因数相乘的结果为63的数\\n    negative_numbers = [-63 \u002F factor for factor in negative_factors]\\n    \\n    # 计算两个数的乘积\\n    product = positive_numbers[0] * negative_numbers[0]\\n    \\n    return product\\n\\nresult = find_numbers()\\nprint(result)\",\n    \"sender\": \"Agent\",\n    \"formatted\": {\n        \"tool_type\": \"code interpreter\",\n        \"thought\": \"首先，我们需要找出63的所有正因数和负因数。63的正因数可以通过分解63的质因数来找出，即\\\\(63 = 3^2 \\\\times 7\\\\)。因此，63的正因数包括1, 3, 7, 9, 21, 和 63。对于负因数，我们只需将上述正因数乘以-1。\\n\\n接下来，我们需要找出与63的正因数相乘的结果为63的数，以及与63的负因数相乘的结果为63的数。这可以通过将63除以每个正因数和负因数来实现。\\n\\n最后，我们将找到的两个数相乘得到最终答案。\\n\\n下面是Python代码实现：\\n\\n\",\n        \"action\": \"def find_numbers():\\n    # 正因数\\n    positive_factors = [1, 3, 7, 9, 21, 63]\\n    # 负因数\\n    negative_factors = [-1, -3, -7, -9, -21, -63]\\n    \\n    # 找到与正因数相乘的结果为63的数\\n    positive_numbers = [63 \u002F factor for factor in positive_factors]\\n    # 找到与负因数相乘的结果为63的数\\n    negative_numbers = [-63 \u002F factor for factor in negative_factors]\\n    \\n    # 计算两个数的乘积\\n    product = positive_numbers[0] * negative_numbers[0]\\n    \\n    return product\\n\\nresult = find_numbers()\\nprint(result)\",\n        \"status\": 1\n    },\n    \"extra_info\": null,\n    \"type\": null,\n    \"receiver\": null,\n    \"stream_state\": 0\n}\n````\n\n### 工具调用的一致性\n\n`ActionExecutor` 使用与 `Agent` 相同的通信数据结构，但要求输入 `AgentMessage` 的内容是一个包含以下键的字典：\n\n- `name`: 工具名称，例如 `'IPythonInterpreter'`、`'WebBrowser.search'`。\n- `parameters`: 工具 API 的关键字参数，例如 `{'command': 'import math;math.sqrt(2)'}`、`{'query': ['recent progress in AI']}`。\n\n你可以注册自定义钩子来进行消息转换。\n\n```python\nfrom lagent.hooks import Hook\nfrom lagent.schema import ActionReturn, ActionStatusCode, AgentMessage\nfrom lagent.actions import ActionExecutor, IPythonInteractive\n\nclass CodeProcessor(Hook):\n    def before_action(self, executor, message, session_id):\n        message = message.copy(deep=True)\n        message.content = dict(\n            name='IPythonInteractive', parameters={'command': message.formatted['action']}\n        )\n        return message\n\n    def after_action(self, executor, message, session_id):\n        action_return = message.content\n        if isinstance(action_return, ActionReturn):\n            if action_return.state == ActionStatusCode.SUCCESS:\n                response = action_return.format_result()\n            else:\n                response = action_return.errmsg\n        else:\n            response = action_return\n        message.content = response\n        return message\n\nexecutor = ActionExecutor(actions=[IPythonInteractive()], hooks=[CodeProcessor()])\nbot_msg = AgentMessage(\n    sender='Agent',\n    content='首先，我们需要...',\n    formatted={\n        'tool_type': 'code interpreter',\n        'thought': '首先，我们需要...',\n        'action': 'def find_numbers():\\n    # 正因数\\n    positive_factors = [1, 3, 7, 9, 21, 63]\\n    # 负因数\\n    negative_factors = [-1, -3, -7, -9, -21, -63]\\n    \\n    # 找到与正因数相乘的结果为63的数\\n    positive_numbers = [63 \u002F factor for factor in positive_factors]\\n    # 找到与负因数相乘的结果为63的数\\n    negative_numbers = [-63 \u002F factor for factor in negative_factors]\\n    \\n    # 计算两个数的乘积\\n    product = positive_numbers[0] * negative_numbers[0]\\n    \\n    return product\\n\\nresult = find_numbers()\\nprint(result)',\n        'status': 1\n    })\nexecutor_msg = executor(bot_msg)\nprint(executor_msg)\n```\n\n```\ncontent='3969.0' sender='ActionExecutor' formatted=None extra_info=None type=None receiver=None stream_state=\u003CAgentStatusCode.END: 0>\n```\n\n**为了方便起见，Lagent 提供了 `InternLMActionProcessor`，它适用于上述提到的由 `ToolParser` 格式化的消息。**\n\n### 双重接口\n\nLagent 采用了双重接口设计，几乎每个组件（LLMs、actions、action executors 等）都有对应的异步变体，只需在其标识符前加上 `Async` 即可。建议在调试时使用同步代理，而在大规模推理时使用异步代理，以充分利用空闲的 CPU 和 GPU 资源。\n\n然而，务必确保代理内部的一致性，即异步代理应配备异步 LLM 和驱动异步工具的异步行动执行器。\n\n```python\nfrom lagent.llms import VllmModel, AsyncVllmModel, LMDeployPipeline, AsyncLMDeployPipeline\nfrom lagent.actions import ActionExecutor, AsyncActionExecutor, WebBrowser, AsyncWebBrowser\nfrom lagent.agents import Agent, AsyncAgent, AgentForInternLM, AsyncAgentForInternLM\n```\n\n______________________________________________________________________\n\n## 实践\n\n- **除非必要，尽量实现子类的 `forward` 方法而不是 `__call__` 方法。**\n- **始终显式地包含 `session_id` 参数，该参数旨在在并发环境中隔离内存、LLM 请求和工具调用（例如维护多个独立的 IPython 环境）。**\n\n### 单一智能体\n\n通过编程解决问题的数学智能体\n\n````python\nfrom lagent.agents.aggregator import InternLMToolAggregator\n\nclass Coder(Agent):\n    def __init__(self, model_path, system_prompt, max_turn=3):\n        super().__init__()\n        llm = VllmModel(\n            path=model_path,\n            meta_template=INTERNLM2_META,\n            tp=1,\n            top_k=1,\n            temperature=1.0,\n            stop_words=['\\n```\\n', '\u003C|im_end|>'],\n            max_new_tokens=1024,\n        )\n        self.agent = Agent(\n            llm,\n            system_prompt,\n            output_format=ToolParser(\n                tool_type='code interpreter', begin='```python\\n', end='\\n```\\n'\n            ),\n            # `InternLMToolAggregator` 是为聚合包含工具调用和执行结果的消息而适配的\n            aggregator=InternLMToolAggregator(),\n        )\n        self.executor = ActionExecutor([IPythonInteractive()], hooks=[CodeProcessor()])\n        self.max_turn = max_turn\n\n    def forward(self, message: AgentMessage, session_id=0) -> AgentMessage:\n        for _ in range(self.max_turn):\n            message = self.agent(message, session_id=session_id)\n            if message.formatted['tool_type'] is None:\n                return message\n            message = self.executor(message, session_id=session_id)\n        return message\n\ncoder = Coder('Qwen\u002FQwen2-7B-Instruct', 'Solve the problem step by step with assistance of Python code')\nquery = AgentMessage(\n    sender='user',\n    content='Find the projection of $\\\\mathbf{a}$ onto $\\\\mathbf{b} = '\n    '\\\\begin{pmatrix} 1 \\\\\\\\ -3 \\\\end{pmatrix}$ if $\\\\mathbf{a} \\\\cdot \\\\mathbf{b} = 2.$'\n)\nanswer = coder(query)\nprint(answer.content)\nprint('-' * 120)\nfor msg in coder.state_dict()['agent.memory']:\n    print('*' * 80)\n    print(f'{msg[\"sender\"]}:\\n\\n{msg[\"content\"]}')\n````\n\n### 多智能体\n\n通过自我改进来提升写作质量的异步博客撰写智能体（[原始 AutoGen 示例](https:\u002F\u002Fmicrosoft.github.io\u002Fautogen\u002F0.2\u002Fdocs\u002Ftopics\u002Fprompting-and-reasoning\u002Freflection\u002F)）\n\n```python\nimport asyncio\nimport os\nfrom lagent.llms import AsyncGPTAPI\nfrom lagent.agents import AsyncAgent\nos.environ['OPENAI_API_KEY'] = 'YOUR_API_KEY'\n\nclass PrefixedMessageHook(Hook):\n    def __init__(self, prefix: str, senders: list = None):\n        self.prefix = prefix\n        self.senders = senders or []\n\n    def before_agent(self, agent, messages, session_id):\n        for message in messages:\n            if message.sender in self.senders:\n                message.content = self.prefix + message.content\n\nclass AsyncBlogger(AsyncAgent):\n    def __init__(self, model_path, writer_prompt, critic_prompt, critic_prefix='', max_turn=3):\n        super().__init__()\n        llm = AsyncGPTAPI(model_type=model_path, retry=5, max_new_tokens=2048)\n        self.writer = AsyncAgent(llm, writer_prompt, name='writer')\n        self.critic = AsyncAgent(\n            llm, critic_prompt, name='critic', hooks=[PrefixedMessageHook(critic_prefix, ['writer'])]\n        )\n        self.max_turn = max_turn\n\n    async def forward(self, message: AgentMessage, session_id=0) -> AgentMessage:\n        for _ in range(self.max_turn):\n            message = await self.writer(message, session_id=session_id)\n            message = await self.critic(message, session_id=session_id)\n        return await self.writer(message, session_id=session_id)\n\nblogger = AsyncBlogger(\n    'gpt-4o-2024-05-13',\n    writer_prompt=\"You are an writing assistant tasked to write engaging blogpost. You try to generate the best blogpost possible for the user's request. \"\n    \"If the user provides critique, then respond with a revised version of your previous attempts\",\n    critic_prompt=\"Generate critique and recommendations on the writing. Provide detailed recommendations, including requests for length, depth, style, etc..\",\n    critic_prefix='Reflect and provide critique on the following writing. \\n\\n',\n)\nuser_prompt = (\n    \"Write an engaging blogpost on the recent updates in {topic}. \"\n    \"The blogpost should be engaging and understandable for general audience. \"\n    \"Should have more than 3 paragraphes but no longer than 1000 words.\")\nbot_msgs = asyncio.get_event_loop().run_until_complete(\n    asyncio.gather(\n        *[\n            blogger(AgentMessage(sender='user', content=user_prompt.format(topic=topic)), session_id=i)\n            for i, topic in enumerate(['AI', 'Biotechnology', 'New Energy', 'Video Games', 'Pop Music'])\n        ]\n    )\n)\nprint(bot_msgs[0].content)\nprint('-' * 120)\nfor msg in blogger.state_dict(session_id=0)['writer.memory']:\n    print('*' * 80)\n    print(f'{msg[\"sender\"]}:\\n\\n{msg[\"content\"]}')\nprint('-' * 120)\nfor msg in blogger.state_dict(session_id=0)['critic.memory']:\n    print('*' * 80)\n    print(f'{msg[\"sender\"]}:\\n\\n{msg[\"content\"]}')\n```\n\n一个执行信息检索、数据收集和图表绘制的多智能体工作流（[原始 LangGraph 示例](https:\u002F\u002Fvijaykumarkartha.medium.com\u002Fmultiple-ai-agents-creating-multi-agent-workflows-using-langgraph-and-langchain-0587406ec4e6\u002F)）\n\n\u003Cdiv align=\"center\">\n    \u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FInternLM_lagent_readme_ef7a746f6a28.jpeg\" width=\"850\" \u002F>\n\u003C\u002Fdiv>\n\n````python\nimport json\nfrom lagent.actions import IPythonInterpreter, WebBrowser, ActionExecutor\nfrom lagent.agents.stream import get_plugin_prompt\nfrom lagent.llms import GPTAPI\nfrom lagent.hooks import InternLMActionProcessor\n\nTOOL_TEMPLATE = (\n    \"You are a helpful AI assistant, collaborating with other assistants. Use the provided tools to progress\"\n    \" towards answering the question. If you are unable to fully answer, that's OK, another assistant with\"\n    \" different tools will help where you left off. Execute what you can to make progress. If you or any of\"\n    \" the other assistants have the final answer or deliverable, prefix your response with {finish_pattern}\"\n    \" so the team knows to stop. You have access to the following tools:\\n{tool_description}\\nPlease provide\"\n    \" your thought process when you need to use a tool, followed by the call statement in this format:\"\n    \"\\n{invocation_format}\\\\\\\\n**{system_prompt}**\"\n)\n\nclass 数据可视化器(代理):\n    def __init__(self, 模型路径, 研究提示, 图表提示, 结束模式=\"最终答案\", 最大轮数=10):\n        super().__init__()\n        llm = GPTAPI(模型路径, 密钥='YOUR_OPENAI_API_KEY', 重试次数=5, 最大生成长度=1024, 停止词=[\"```\\n\"])\n        解释器, 浏览器 = IPython解释器(), Web浏览器(\"BingSearch\", api_key=\"YOUR_BING_API_KEY\")\n        self.研究员 = 代理(\n            llm,\n            TOOL_TEMPLATE.format(\n                结束模式=结束模式,\n                工具描述=get_plugin_prompt(浏览器),\n                调用格式='```json\\n{\"name\": {{工具名称}}, \"parameters\": {{关键字参数}}}\\n```\\n',\n                系统提示=研究提示,\n            ),\n            输出格式=ToolParser(\n                \"browser\",\n                开始=\"```json\\n\",\n                结束=\"\\n```\\n\",\n                验证=lambda x: json.loads(x.rstrip('`')),\n            ),\n            聚合器=InternLMToolAggregator(),\n            名称=\"researcher\",\n        )\n        self.制图员 = 代理(\n            llm,\n            TOOL_TEMPLATE.format(\n                结束模式=结束模式,\n                工具描述=解释器.name,\n                调用格式='```python\\n{{代码}}\\n```\\n',\n                系统提示=图表提示,\n            ),\n            输出格式=ToolParser(\n                \"interpreter\",\n                开始=\"```python\\n\",\n                结束=\"\\n```\\n\",\n                验证=lambda x: x.rstrip('`'),\n            ),\n            聚合器=InternLMToolAggregator(),\n            名称=\"charter\",\n        )\n        self.执行器 = 行动执行器([解释器, 浏览器], 钩子=[InternLMActionProcessor()])\n        self.结束模式 = 结束模式\n        self.最大轮数 = 最大轮数\n\n    def forward(self, 消息, 会话ID=0):\n        for _ in range(self.最大轮数):\n            消息 = 自己.研究员(消息, 会话ID=会话ID, 停止词=[\"```\\n\", \"```python\"]) # 覆盖llm的停止词\n            while 消息.格式化[\"工具类型\"]:\n                消息 = 自己.执行器(消息, 会话ID=会话ID)\n                消息 = 自己.研究员(消息, 会话ID=会话ID, 停止词=[\"```\\n\", \"```python\"])\n            if 自己.结束模式 在 消息.内容 中:\n                return 消息\n            消息 = 自己.制图员(消息)\n            while 消息.格式化[\"工具类型\"]:\n                消息 = 自己.执行器(消息, 会话ID=会话ID)\n                消息 = 自己.制图员(消息, 会话ID=会话ID)\n            if 自己.结束模式 在 消息.内容 中:\n                return 消息\n        return 消息\n\n可视化器 = 数据可视化器(\n    \"gpt-4o-2024-05-13\",\n    研究提示=\"您应提供准确的数据供图表生成器使用。\",\n    图表提示=\"您展示的任何图表都将对用户可见。\",\n)\n用户消息 = 代理消息(\n    发送者='user',\n    内容=\"获取中国过去5年的GDP数据，然后绘制折线图。编码完成后请结束。\"\n)\n机器人消息 = 可视化器(用户消息)\nprint(机器人消息.内容)\njson.dump(可视化器.状态字典(), open('visualizer.json', 'w'), ensure_ascii=False, indent=4)\n````\n\n\n\n## 引用\n\n如果您在研究中发现本项目有用，请考虑引用：\n\n```latex\n@misc{lagent2023,\n    title={{Lagent: InternLM} 是一个轻量级开源框架，允许用户高效构建基于大型语言模型(LLM)的智能体},\n    author={Lagent开发者团队},\n    howpublished = {\\url{https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent}},\n    year={2023}\n}\n```\n\n## 许可证\n\n本项目采用[Apache 2.0许可证](LICENSE)发布。\n\n\u003Cp align=\"right\">\u003Ca href=\"#top\">🔼 返回顶部\u003C\u002Fa>\u003C\u002Fp>","# Lagent 快速上手指南\n\nLagent 是一个轻量级的开源框架，灵感来源于 PyTorch 的设计理念。它将智能体（Agent）的工作流抽象为类似神经网络的“层”，开发者只需以 Pythonic 的方式创建组件并定义消息传递，即可快速构建多智能体应用。\n\n## 环境准备\n\n在开始之前，请确保您的开发环境满足以下要求：\n\n*   **操作系统**: Linux 或 macOS (Windows 用户建议使用 WSL2)\n*   **Python 版本**: Python 3.8 及以上\n*   **前置依赖**:\n    *   `git`: 用于克隆代码仓库\n    *   `pip`: Python 包管理工具\n    *   (可选) GPU 驱动及 CUDA 环境：如果您计划本地部署大模型并使用 vLLM 加速推理。\n\n## 安装步骤\n\n推荐通过源码安装，以便获取最新功能并进行二次开发。\n\n```bash\n# 1. 克隆仓库\ngit clone https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent.git\n\n# 2. 进入项目目录\ncd lagent\n\n# 3. 以可编辑模式安装\npip install -e .\n```\n\n> **提示**：国内用户若遇到下载速度慢的问题，可配置 pip 使用国内镜像源（如清华源）：\n> `pip install -e . -i https:\u002F\u002Fpypi.tuna.tsinghua.edu.cn\u002Fsimple`\n\n## 基本使用\n\nLagent 的核心在于 `Agent` 类，它封装了大语言模型（LLM）、系统提示词（System Prompt）以及记忆模块。以下是构建一个简单智能体的最小示例。\n\n### 1. 初始化模型与智能体\n\n首先导入必要的模块，配置 LLM 参数（此处以 Qwen2-7B-Instruct 为例），并实例化 Agent。\n\n```python\nfrom typing import Dict, List\nfrom lagent.agents import Agent\nfrom lagent.schema import AgentMessage\nfrom lagent.llms import VllmModel, INTERNLM2_META\n\n# 初始化大语言模型\nllm = VllmModel(\n    path='Qwen\u002FQwen2-7B-Instruct',\n    meta_template=INTERNLM2_META,\n    tp=1,\n    top_k=1,\n    temperature=1.0,\n    stop_words=['\u003C|im_end|>'],\n    max_new_tokens=1024,\n)\n\n# 定义系统提示词\nsystem_prompt = '你的回答只能从“典”、“孝”、“急”三个字中选一个。'\n\n# 创建智能体\nagent = Agent(llm, system_prompt)\n```\n\n### 2. 发送消息并获取回复\n\nLagent 使用 `AgentMessage` 对象进行通信。调用智能体实例即可处理消息并返回回复。\n\n```python\n# 构造用户消息\nuser_msg = AgentMessage(sender='user', content='今天天气情况')\n\n# 获取智能体回复\nbot_msg = agent(user_msg)\n\n# 打印回复内容\nprint(bot_msg.content)\n```\n\n**预期输出：**\n```text\n急\n```\n\n### 3. 管理会话记忆\n\nLagent 会自动在每次交互中将输入和输出消息添加到内存中。您可以查看、导出或清空当前会话的记忆。\n\n```python\n# 查看内存中的消息列表\nmemory: List[AgentMessage] = agent.memory.get_memory()\nprint(memory)\n\n# 清空当前会话记忆 (默认 session_id=0)\nagent.reset()\n```\n\n### 进阶特性简述\n\n*   **自定义消息聚合**：通过继承 `DefaultAggregator`，您可以轻松实现 Few-shot（少样本学习）等功能，控制发送给 LLM 的消息格式。\n*   **灵活的工具调用**：内置 `ToolParser` 可解析模型输出的代码块，配合 `ActionExecutor` 和 `IPythonInteractive` 等工具，可实现自动代码执行与结果反馈。\n*   **双接口支持**：核心组件均提供同步和异步两种接口（异步组件名称通常带有特定前缀），方便集成到高并发场景中。","某电商初创团队希望快速构建一个能自动处理售后咨询、查询订单状态并协调退款流程的多智能体客服系统。\n\n### 没有 lagent 时\n- 开发者需手动编写大量样板代码来管理不同大模型之间的消息传递格式，导致开发效率低下且容易出错。\n- 多轮对话的历史记忆难以统一维护，每次新增功能都要重新设计状态存储逻辑，代码耦合度极高。\n- 想要串联“意图识别”、“订单查询”和“退款执行”三个独立智能体时，缺乏标准化的通信机制，调试过程如同“黑盒”。\n- 扩展新业务场景（如增加物流追踪）往往需要重构整个交互框架，无法像搭积木一样灵活插入新模块。\n\n### 使用 lagent 后\n- 借鉴 PyTorch 的分层设计理念，开发者只需定义清晰的 Agent 层和消息流，即可用极简的 Python 代码完成复杂智能体编排。\n- 内置的记忆管理机制自动在每次交互中存取对话历史，通过 `state_dict` 即可轻松查看或重置会话状态，无需重复造轮子。\n- 利用标准的 `AgentMessage` 协议，多个智能体之间能够顺畅传递结构化信息，让“查询 - 决策 - 执行”的全链路透明可控。\n- 新增物流追踪智能体时，仅需实例化新类并接入消息流，原有架构无需改动，真正实现了模块化热插拔。\n\nlagent 将复杂的智能体协作简化为直观的消息传递与层级构建，让开发者从繁琐的基础设施中解放，专注于业务逻辑创新。","https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FInternLM_lagent_a836233c.png","InternLM","https:\u002F\u002Foss.gittoolsai.com\u002Favatars\u002FInternLM_bc4eb14c.png","",null,"internlm@pjlab.org.cn","intern_lm","https:\u002F\u002Fchat.intern-ai.org.cn\u002F","https:\u002F\u002Fgithub.com\u002FInternLM",[81],{"name":82,"color":83,"percentage":84},"Python","#3572A5",100,2232,226,"2026-04-07T02:03:09","Apache-2.0","未说明","非框架本身强制要求，但示例代码使用 VllmModel (vLLM)，通常运行大模型需要 NVIDIA GPU。具体显存和 CUDA 版本取决于所选模型（如示例中的 Qwen2-7B）及 vLLM 的要求。",{"notes":92,"python":89,"dependencies":93},"README 中未明确列出具体的系统环境需求（如 OS、Python 版本、具体依赖列表）。安装方式仅为源码克隆后执行 'pip install -e .'。示例代码展示了基于 vLLM 加载 'Qwen\u002FQwen2-7B-Instruct' 模型的用法，实际硬件需求（GPU 显存等）将主要取决于用户选择部署的具体大语言模型，而非 lagent 框架本身。框架设计灵感来自 PyTorch，强调模块化代理构建。",[94,95,96],"vllm (示例中使用)","torch (隐含依赖)","transformers (隐含依赖)",[13,14,35],[99,100,101,102],"agent","gpt","llm","transformers","2026-03-27T02:49:30.150509","2026-04-08T12:12:00.624416",[106,111,116,121,126,131],{"id":107,"question_zh":108,"answer_zh":109,"source_url":110},24173,"遇到 'ModuleNotFoundError: No module named lagent.llms.lmdeploy_wrapper' 错误如何解决？","该错误通常是因为未安装或版本不匹配导致的。首先确认已安装最新版本的 lagent（如 0.2.3+）。如果问题依旧，检查导入路径是否正确：应使用 `from lagent.llms.lmdeploy_wrapper import LMDeployClient`。若不需要本地部署 lmdeploy，可参考官方建议自行实现一个继承自 BaseModel 的类来调用远程 API，避免安装沉重的 torch 依赖。","https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fissues\u002F192",{"id":112,"question_zh":113,"answer_zh":114,"source_url":115},24174,"模型生成的代码块包含 ```python 前缀导致解析失败怎么办？","部分模型无法严格遵循模板生成不带标记的代码。目前的临时解决方案是手动处理响应字符串，在传递给解释器之前移除 '```python' 和 '```' 标记。维护者表示未来会增强模型能力以自动修复此问题，现阶段建议在代码逻辑中添加预处理步骤来提取纯代码内容。","https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fissues\u002F23",{"id":117,"question_zh":118,"answer_zh":119,"source_url":120},24175,"如何使用 BaseAPIModel 接入自定义的云端大模型 URL？","BaseAPIModel 是一个基类，不直接包含具体的 URL 配置。如果需要接入自定义云端模型且不想安装 lmdeploy，可以继承 BaseModel 并实现自己的类（例如 RequestPostModel）。在 chat 方法中使用 requests.post 发送请求到 self.chat_completions_v1_url，并处理返回的流式数据。具体实现可参考社区提供的代码示例，构建包含 headers 和 json payload 的请求。","https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fissues\u002F159",{"id":122,"question_zh":123,"answer_zh":124,"source_url":125},24176,"Lagent 是否支持多轮对话式的 Agent 数据集（多轮规划与工具调用）？","支持的。ReActAgent 本身就是按照这种逻辑实现的。它可以处理单用户输入下的多轮规划（Planning）和执行（Action），即在一个任务中连续多次调用工具（如先用工具查询数据，再用工具处理数据）。数据集格式中可以包含多轮 input\u002Foutput 对，其中 system 角色可以传递上一轮的工具执行结果，Bot 角色继续生成新的 Action。","https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fissues\u002F71",{"id":127,"question_zh":128,"answer_zh":129,"source_url":130},24177,"在使用数据分析功能时，为什么生成的图表（plot）无法显示？","这通常是因为 Streamlit 环境与 IPythonInterpreter 的消息类型处理冲突导致的。当导入 streamlit 时，matplotlib 生成的图表消息类型可能被识别为 'stream' 而非 'display_data'，从而导致跳过渲染。解决方法包括：1. 检查 ipython_interpreter.py 中的消息类型处理逻辑；2. 尝试在非 Streamlit 环境下运行代码验证；3. 参考 Streamlit 官方关于图片显示的 issue (#9640) 进行适配，或者确保在代码中正确捕获并输出图像数据而不是直接调用 plt.show()。","https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fissues\u002F243",{"id":132,"question_zh":133,"answer_zh":134,"source_url":135},24178,"如何在 Lagent 框架中替换默认的 InternLM 模型为 ChatGLM-6B 等其他开源模型？","可以通过实例化 `HFTransformer` 类来加载本地 HuggingFace 模型。代码示例如下：\n```python\nfrom lagent.agents import ReAct\nfrom lagent.actions import ActionExecutor, PythonInterpreter\nfrom lagent.llms import HFTransformer\n\n# 加载本地模型\nllm = HFTransformer('\u002Fpath\u002Fto\u002Fchatglm2-6b')\n\n# 定义动作执行器\npython_interpreter = PythonInterpreter()\nexecutor = ActionExecutor(actions=[python_interpreter])\n\n# 初始化 Agent\nchatbot = ReAct(llm=llm, action_executor=executor)\n```\n确保模型路径正确且环境已安装对应的 transformers 库。","https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fissues\u002F29",[137,142,147,152,157,162,167,172,177,182,186],{"id":138,"version":139,"summary_zh":140,"released_at":141},145750,"v0.5.0rc3","## 变更内容\n* 更新 runtime.txt，添加 tenacity，由 @vansin 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F280 中完成\n* 修复 `AsyncDDGS` 的搜索 API，由 @braisedpork1964 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F281 中完成\n* 【模型】支持 Claude，由 @Harold-lkk 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F283 中完成\n* 修复 anthropic 相关问题，由 @Harold-lkk 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F284 中完成\n* 支持 o1 和 Claude，由 @Harold-lkk 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F285 中完成\n* 在 AsyncLMDeployPipeline (lmdeploy_wrapper.py) 中添加 do_sample 参数，由 @shinkungoo 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F290 中完成\n* 修复：Qwen 模型无法正确适配 & 修复同步模式下 openai 流式输出问题，由 @wojiaoyishang 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F289 中完成\n* 【功能】允许在工具描述中自定义参数作用域，由 @braisedpork1964 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F292 中完成\n* 添加 searxng 搜索引擎支持，由 @QiuZiXian 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F293 中完成\n* 版本升级 [0.5.0rc3]，由 @Liqu1d-G 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F298 中完成\n* 【修复】更新 publish-to-pypi.yml 文件，由 @Liqu1d-G 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F299 中完成\n\n## 新贡献者\n* @shinkungoo 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F290 中完成了首次贡献\n* @wojiaoyishang 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F289 中完成了首次贡献\n* @QiuZiXian 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F293 中完成了首次贡献\n\n**完整变更日志**：https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fcompare\u002Fv0.5.0rc2...v0.5.0rc3","2025-03-04T12:51:15",{"id":143,"version":144,"summary_zh":145,"released_at":146},145751,"v0.5.0rc2","## 变更内容\n* 由 @braisedpork1964 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F268 中更新依赖项\n* [功能] 由 @braisedpork1964 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F270 中添加 `Sequential` 和 `AsyncSequential` 代理\n* [修复] `aioify` 的替代方案，由 @braisedpork1964 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F274 中实现\n* [功能] 支持递归或通过键路径重置代理内存，由 @braisedpork1964 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F271 中实现\n* 修复：HTTP 代理服务器，由 @liujiangning30 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F276 中完成\n* [功能] 添加流式代理，由 @braisedpork1964 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F277 中实现\n* 【版本】v0.5.0rc2，由 @vansin 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F278 中发布\n\n\n**完整变更日志**: https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fcompare\u002Fv0.5.0rc1...v0.5.0rc2","2024-11-29T11:39:20",{"id":148,"version":149,"summary_zh":150,"released_at":151},145752,"v0.5.0rc1","## 摘要\r\n\r\n当前的智能体框架主要聚焦于低代码开发（使用静态图或流水线）或特定领域的任务解决，这往往导致调试困难和工作流僵化。\\textbf{L}anguage \\textbf{Agent} 通过提供一种命令式、Python 风格的编程方式，将代码视为智能体，从而有效应对这些挑战。这种方法不仅便于调试，还能简化智能体工作流的开发。此外，Lagent 支持以 HTTP 服务的形式轻松部署，并可通过集中式编程构建分布式多智能体应用，既提升了开发效率，又保证了系统效能。\n\n本文详细阐述了 Lagent 的设计原则及其在架构中的体现。我们强调，Lagent 的每一个环节都是常规的 Python 程序，完全由用户掌控。同时，我们还说明了其运行时关键组件如何通过精心且务实的实现协同工作，从而达到出色的性能表现。\n\n## 以易用性为中心的设计\r\n\r\n因此，智能体本身迅速从单一的“计划-执行-迭代”或“先计划后执行”的模式\\cite{}，演变为包含大量循环和递归函数、形式极为丰富的数值程序。\n\n为了支持这种日益增长的复杂性，Lagent 放弃了基于图式元编程或事件驱动\\cite{}的方法所带来的潜在优势，转而保留 Python 的命令式编程范式。这一设计深受 PyTorch 启发。Lagent 将此理念扩展至智能体工作流的各个方面：定义大模型、工具和记忆模块、部署 HTTP 服务、实现多智能体的分布式协作，以及使推理过程异步化等，均采用面向通用编程所熟悉的概念来表达。\n\n这种方案确保任何新的智能体架构都能轻松地在 Lagent 中实现。例如，在智能体学习中，智能体通常被理解为“指令 + 大模型 + 记忆 + 基于当前状态的计划\u002F行动”，它们一般以 Python 类的形式表示：构造函数用于创建和初始化参数，而前向方法则负责处理输入。同样，多智能体也常被建模为由单个智能体组合而成的类，但我们再次强调，用户并无义务必须按照这种方式组织代码。清单展示了如何利用 Lagent 构建 ReAcT（一种常用的智能体）和 TranslateAgentv（翻译智能体流水线）。需要注意的是，ReACT 实际上已包含在库中，此处我们仍给出一个示例实现，旨在突出其简洁性。\n\n```python\nclass ReACT(Agent):\n   def __init__(self):\n        llm = LLM()\n        self.tools = tools\n        react_instruction = react_instruction.format(\n            action_info=get_tools_description(self.tools)\n        self.select_agent = Agent(\n            llm=llm, template=r","2024-11-05T05:11:37",{"id":153,"version":154,"summary_zh":155,"released_at":156},145753,"v0.2.4","## 变更内容\n* 由 @liujiangning30 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F217 中实现：为 OpenAI API 弹出无效的生成参数\n* 修复：由 @liujiangning30 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F220 中实现：DuckDuckGo 搜索的事件循环问题\n* 新特性：由 @liujiangning30 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F218 中实现：GPTAPI 支持通义千问模型\n* 确保通义千问模型响应的完整性，由 @liujiangning30 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F225 中实现\n* 修复未关闭的事件循环，由 @liujiangning30 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F235 中实现\n* 修复：由 @liujiangning30 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F236 中实现：DuckDuckGo 搜索的超时问题\n* [修复] 修复 griffe 版本问题，由 @fanqiNO1 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F237 中实现\n* 修复 KeyError 错误，由 @liujiangning30 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F226 中实现\n* [功能] 支持 Brave 搜索 API，并重构 Bing 浏览器中的 Google Serper API，由 @tackhwa 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F233 中实现\n* 增加对商汤科技商汤商量系列模型的支持（已经和 MindSearch 项目一起测试 OK），由 @winer632 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F234 中实现\n* [文档] 修复 docs.md 中的一些错误，由 @MING-ZCH 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F249 中实现\n* 更新依赖项，由 @jamiechoi1995 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F245 中实现\n* 更新依赖项，由 @Harold-lkk 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F257 中实现\n* 与 lmdeploy 兼容，由 @lvhan028 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F258 中实现\n* [版本] v0.2.4，由 @Harold-lkk 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F261 中发布\n\n## 新贡献者\n* @winer632 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F234 中完成了首次贡献\n* @MING-ZCH 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F249 中完成了首次贡献\n* @jamiechoi1995 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F245 中完成了首次贡献\n* @lvhan028 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F258 中完成了首次贡献\n\n**完整变更日志**：https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fcompare\u002Fv0.2.3...v0.2.4","2024-10-21T08:15:53",{"id":158,"version":159,"summary_zh":160,"released_at":161},145754,"v0.2.3","## 变更内容\n* 修复 `GPTAPI` 的聊天返回问题，由 @braisedpork1964 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F166 中完成\n* 修复 PPT 和 Google 学术搜索的 bug，由 @liujiangning30 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F167 中完成\n* 修复 overview.md 中的拼写错误“ablility”，由 @tackhwa 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F175 中完成\n* 修复错误信息：将字典强制转换为字符串的问题，由 @liujiangning30 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F172 中完成\n* 新增功能：支持 vLLM，由 @RangiLyu 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F177 中完成\n* 支持使用 Hugging Face 的演示，由 @liujiangning30 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F179 中完成\n* 修复 Internlm2Protocol.parse 的 bug，由 @liujiangning30 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F180 中完成\n* 修复 API 模型中的生成参数问题，由 @braisedpork1964 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F181 中完成\n* 支持批量处理，由 @Harold-lkk 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F182 中完成\n* 修复 GPTAPI 中已弃用的 top_k 参数，由 @Iiji 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F185 中完成\n* 支持 JSON 模式和代理功能，由 @Harold-lkk 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F189 中完成\n* 允许从解释器结果中访问代码，由 @braisedpork1964 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F191 中完成\n* 修复：lmdeploy_wrapper 的拼写错误，由 @fanqiNO1 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F171 中完成\n* 新增功能：GPTAPI 的流式聊天，由 @liujiangning30 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F194 中完成\n* 统一流式返回格式，由 @liujiangning30 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F196 中完成\n* GPTAPI 的流式聊天，由 @liujiangning30 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F197 中完成\n* Mind 搜索功能，由 @Harold-lkk 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F208 中完成\n* 修复：更新依赖项，由 @Liqu1d-G 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F214 中完成\n* 带名字的角色功能，由 @liujiangning30 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F215 中完成\n* 版本升级至 v0.3.0，由 @liujiangning30 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F213 中完成\n* 版本升级至 v0.2.3，由 @liujiangning30 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F216 中完成\n\n## 新贡献者\n* @tackhwa 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F175 中完成了首次贡献\n* @Iiji 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F185 中完成了首次贡献\n* @fanqiNO1 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F171 中完成了首次贡献\n* @Liqu1d-G 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F214 中完成了首次贡献\n\n**完整变更日志**：https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fcompare\u002Fv0.2.2...v0.2.3","2024-07-30T12:31:50",{"id":163,"version":164,"summary_zh":165,"released_at":166},145755,"v0.2.2","## 变更内容\n* 修复 LMDeployClient 的 bug，由 @liujiangning30 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F140 中完成\n* 修复 TritonClient 的 bug，由 @liujiangning30 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F141 中完成\n* 更新 README 示例，由 @Harold-lkk 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F143 中完成\n* 修复类型注解，由 @braisedpork1964 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F144 中完成\n* 【增强】为 actions 添加延迟导入功能，由 @Harold-lkk 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F146 中完成\n* 修复：跳过 start_token，由 @liujiangning30 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F145 中完成\n* 修复：TritonClient 中的 filter_suffix，由 @liujiangning30 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F150 中完成\n* 修复：lmdeploypipeline 中的 gen_config 根据输入的 gen_params 进行更新，由 @liujiangning30 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F151 中完成\n* 将 max_tokens 改为 max_new_tokens，由 @liujiangning30 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F149 中完成\n* 支持 pad_token 和 chatglm 对话推理，由 @zehuichen123 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F157 中完成\n* 功能：不跳过特殊 token，由 @liujiangning30 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F148 中完成\n* 修复批量生成问题，由 @Harold-lkk 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F158 中完成\n* 修复因 static model_name 导致的 bug，由 @liujiangning30 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F156 中完成\n* 更新版本号，由 @liujiangning30 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F161 中完成\n\n\n**完整变更日志**：https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fcompare\u002Fv0.2.1...v0.2.2","2024-02-26T03:08:43",{"id":168,"version":169,"summary_zh":170,"released_at":171},145756,"v0.2.1","## 变更内容\n* 由 @braisedpork1964 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F138 中修复了 `GoogleScholar` 的文档字符串格式。\n* 【版本】由 @braisedpork1964 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F139 中将版本号提升至 v0.2.1。\n\n\n**完整变更日志**: https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fcompare\u002Fv0.2.0...v0.2.1","2024-02-01T05:15:12",{"id":173,"version":174,"summary_zh":175,"released_at":176},145757,"v0.2.0","## 变更内容\n- 流式输出：提供了 `stream_chat` 接口，支持流式输出，让您在本地环境就能轻松运行酷炫的流式演示。\n- 统一了接口设计，并进行了全面的升级，以提升扩展性，具体包括：\n  - 模型：无论是 OpenAI API、Transformers 还是 LMDeploy 推理加速框架，您都可以无缝切换不同的模型。\n  - 行动：通过简单的继承和装饰模式，您可以构建属于自己的工具集，同时适配 InternLM 和 GPT 等多种模型。\n  - 代理：与模型的输入接口保持一致，只需一步即可将模型转换为智能代理，从而更便捷地探索和实现各类代理应用。\n\n- 文档已全面升级，现已覆盖完整的 API 文档。\n\n欢迎观看我们的演示视频：https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=YAelRLi0Zak","2024-01-31T13:47:21",{"id":178,"version":179,"summary_zh":180,"released_at":181},145758,"v0.1.3","0.1 版本的最后一次发布\n\n## 变更内容\n* 更新：在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F56 中由 @liujiangning30 添加了引用\n* 新增韩语版 README，因为大多数韩国开发者完全不会韩语，由 @bhargavshirin 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F57 中完成\n* 由 @Killer2OP 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F59 中更新了 README.md\n* 【新增】在 README 中添加返回顶部按钮，由 @Killer2OP 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F65 中完成\n* 将 README.md 中的“Twitter”改为“𝕏 (Twitter)”，由 @BandhiyaHardik 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F67 中完成\n* 由 @apu52 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F62 中更新了 README.md\n* 由 @Aryan4884 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F58 中更新了 README.md\n* 由 @VinayKokate22 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F68 中更新了 README.md\n* 由 @liujiangning30 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F70 和 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F72 中分别更新了 README.md 和页眉 logo\n* 修复：在 readme.md 中添加了贡献者板块，由 @Kalyanimhala 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F63 中完成\n* 【修复】lmdeploy bc，由 @Harold-lkk 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F74 中完成\n* 【Bug】修复 templateparser，由 @Harold-lkk 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F77 中完成\n* 【修复】修复 turbomind，由 @RangiLyu 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F81 中完成\n* 为 internlm2 更新 ReAct 示例，由 @liujiangning30 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F85 中完成\n* 【版本】v0.1.3，由 @Harold-lkk 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F110 中发布\n\n## 新贡献者\n* @bhargavshirin 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F57 中完成了首次贡献\n* @Killer2OP 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F59 中完成了首次贡献\n* @BandhiyaHardik 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F67 中完成了首次贡献\n* @apu52 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F62 中完成了首次贡献\n* @Aryan4884 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F58 中完成了首次贡献\n* @VinayKokate22 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F68 中完成了首次贡献\n* @Kalyanimhala 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F63 中完成了首次贡献\n* @RangiLyu 在 https:\u002F\u002Fgithub.com\u002FInternLM\u002Flagent\u002Fpull\u002F81 中完成了首次贡献","2024-01-30T03:34:57",{"id":183,"version":184,"summary_zh":75,"released_at":185},145759,"v0.1.2","2023-10-24T14:48:20",{"id":187,"version":188,"summary_zh":189,"released_at":190},145760,"v0.1.1","## 主要特性\n\n- 开箱即用，支持多种智能体。Lagent 现已支持 [ReAct](https:\u002F\u002Farxiv.org\u002Fabs\u002F2210.03629)、[AutoGPT](https:\u002F\u002Fgithub.com\u002FSignificant-Gravitas\u002FAuto-GPT) 和 [ReWOO](https:\u002F\u002Farxiv.org\u002Fabs\u002F2305.18323)，这些智能体能够驱动大语言模型进行多轮推理和函数调用。\n- 极其简单易扩展。该框架结构清晰、简洁明了。仅需 20 行代码，即可构建属于您自己的智能体。同时，它还支持三种典型工具：Python 解释器、API 调用和 Google 搜索。\n- 支持多种大语言模型。我们兼容各类大语言模型，包括基于 API 的（如 GPT-3.5\u002F4）以及开源模型（如 LLaMA 2、InternLM）。","2023-08-22T03:46:25"]