最近在尝试将大语言模型(LLM)的能力集成到本地工作流中时,发现了一个普遍痛点:虽然各大模型厂商都提供了功能强大的 API,但每次想快速测试一个想法、调用一个模型或者组合多个工具时,都需要手动编写脚本、处理认证、解析响应,过程繁琐且难以复用。有没有一种工具,能像使用系统命令一样,通过简单的命令行直接与各种 AI 模型和工具交互?

Agent-Reach 正是为解决这一问题而生的开源项目。它是一个功能强大的 AI Agent 命令行工具,旨在为开发者提供一个统一、便捷的接口,来调用包括 OpenAI、Anthropic、Google Gemini、DeepSeek 等在内的多种大模型,并集成网络搜索、代码执行等扩展能力。本文将带你从零开始,全面掌握 Agent-Reach 的安装、配置、核心使用以及高级功能,让你在终端中轻松驾驭 AI 能力。

无论你是想快速验证一个提示词(Prompt)的效果,还是希望构建一个自动化的 AI 辅助脚本,亦或是作为学习 AI Agent 开发的实践起点,本文都将提供一套完整的实战指南。我们将覆盖从基础环境搭建到复杂技能(Skill)组合的全流程,并附上详细的代码示例和常见问题排查思路。

1. 背景与核心概念:什么是 Agent-Reach?

在深入实操之前,我们有必要厘清几个核心概念,理解 Agent-Reach 的设计初衷和它在 AI 开发生态中的位置。

1.1 AI Agent 与 CLI 工具

AI Agent 通常指能够感知环境、自主决策并执行行动以实现目标的智能体。在当前的语境下,它常指基于大语言模型(LLM)构建的、能够调用外部工具(如搜索引擎、计算器、数据库)来完成复杂任务的程序。

CLI(Command Line Interface) 即命令行界面,是开发者与计算机系统交互的高效方式。将 AI Agent 的能力封装成 CLI 工具,意味着开发者可以绕过图形界面和复杂的 SDK 集成,直接在终端(Terminal)或 Shell 脚本中调用 AI 功能,极大地提升了开发、测试和自动化的效率。

Agent-Reach 本质上是一个 桥梁 ,它一端连接着终端用户简单的文本指令,另一端连接着背后复杂的大模型 API 和各种工具服务。它帮你处理了所有“脏活累活”:HTTP 请求构造、API 密钥管理、响应解析、上下文维护以及工具调度的逻辑。

1.2 Agent-Reach 的核心特性

根据其项目定位,Agent-Reach 主要提供以下能力:

  1. 多模型支持 :一站式接入 OpenAI GPT 系列、Anthropic Claude 系列、Google Gemini、DeepSeek、智谱 AI 等主流模型,无需为每个模型单独写适配代码。
  2. 统一命令行交互 :通过类似 agent-reach chat --model gpt-4 这样的命令,直接开始与模型对话。
  3. 技能(Skill)系统 :这是其“Agent”能力的核心。除了基础的聊天,它还内置或允许扩展多种技能,例如:
    • 网络搜索 :让模型获取实时信息。
    • 代码执行 :在安全沙箱中运行模型生成的代码(如 Python)。
    • 文件操作 :读取、分析本地文件内容。
    • 自定义技能 :开发者可以编写自己的技能来扩展其能力边界。
  4. 上下文管理 :自动维护对话历史,支持多轮交互,让模型拥有“记忆”。
  5. 配置化管理 :所有模型 API 密钥、默认参数等均通过配置文件管理,安全且灵活。

1.3 典型应用场景

  • 快速原型验证 :在 IDE 和终端之间快速切换,测试不同提示词对不同模型的效果。
  • 自动化脚本 :编写 Shell 脚本或 Python 脚本,利用 agent-reach 命令自动生成代码片段、撰写文档、分析日志文件等。
  • 学习与教学 :作为理解 AI Agent 工作流程和工具调用机制的绝佳实践项目。
  • 个人效率助手 :在终端中直接询问天气、翻译句子、计算复杂公式或搜索技术问题。

接下来,我们将进入实战环节,从环境准备开始。

2. 环境准备与安装指南

Agent-Reach 是一个 Python 项目,因此你需要一个可用的 Python 环境。本文将使用 Python 3.8+ 版本进行演示。

2.1 基础环境检查

首先,打开你的终端(Linux/macOS 的 Terminal,Windows 的 PowerShell 或 CMD),检查 Python 和 pip 版本。

# 检查 Python 版本,确保是 3.8 或更高
python3 --version
# 或
python --version

# 检查 pip 版本
pip3 --version
# 或
pip --version

如果未安装 Python,请前往 Python 官网 下载并安装最新稳定版。安装时务必勾选 “Add Python to PATH” 选项。

2.2 安装 Agent-Reach

Agent-Reach 通常通过 Python 的包管理工具 pip 进行安装。最直接的方式是从其源代码仓库安装。

# 使用 pip 从 Git 仓库直接安装(推荐)
pip3 install git+https://github.com/panniantong/Agent-Reach.git

# 或者,如果你更喜欢先克隆项目
git clone https://github.com/panniantong/Agent-Reach.git
cd Agent-Reach
pip3 install -e .  # '-e' 代表可编辑模式,方便后续修改代码

安装完成后,验证是否成功:

agent-reach --version
# 或
agent-reach --help

如果看到命令帮助信息,说明安装成功。 --help 命令是你最好的朋友,它可以列出所有可用的子命令和参数。

2.3 项目结构初窥(可选)

如果你以可编辑模式( -e )安装并克隆了项目,可以看一下其目录结构,这对后续理解和自定义技能有帮助。

Agent-Reach/
├── agent_reach/          # 核心 Python 包
│   ├── cli.py           # 命令行入口点
│   ├── config.py        # 配置管理
│   ├── skills/          # 技能实现目录
│   │   ├── web_search.py
│   │   ├── python_executor.py
│   │   └── ...
│   └── ...
├── pyproject.toml       # 项目依赖和元数据
├── README.md
└── ...

关键目录 agent_reach/skills/ 存放了所有内置技能的实现代码,这是我们后续扩展的基础。

3. 核心配置:连接你的 AI 模型

安装只是第一步,要让 Agent-Reach 工作,你必须配置至少一个可用的 AI 模型 API。所有配置都通过一个 YAML 文件管理。

3.1 初始化配置文件

首次运行时,Agent-Reach 会引导你创建配置文件。但我们可以主动创建它。

# 创建配置目录(通常位于用户主目录下)
mkdir -p ~/.config/agent_reach

# 创建并编辑配置文件
# 你可以使用任何文本编辑器,如 vim, nano, 或 VS Code
nano ~/.config/agent_reach/config.yaml

3.2 配置文件详解

下面是一个完整的 config.yaml 示例,配置了 OpenAI 和 Anthropic 两个模型。 请将 your-api-key-here 替换为你自己的真实 API 密钥。

# ~/.config/agent_reach/config.yaml

# 全局默认设置
defaults:
  model: gpt-4o-mini  # 默认使用的模型
  temperature: 0.7     # 默认创造性,0-2之间,越高越随机
  max_tokens: 2000     # 默认生成的最大token数

# 模型提供商配置
providers:
  openai:
    api_key: "sk-your-openai-api-key-here"  # 你的 OpenAI API Key
    # base_url: "https://api.openai.com/v1" # 默认,如需使用代理或自定义端点可修改
    models:
      - gpt-4o
      - gpt-4o-mini
      - gpt-4-turbo
      - gpt-3.5-turbo

  anthropic:
    api_key: "sk-ant-your-anthropic-api-key-here"  # 你的 Claude API Key
    models:
      - claude-3-5-sonnet-20241022
      - claude-3-opus-20240229
      - claude-3-sonnet-20240229
      - claude-3-haiku-20240307

  google:
    api_key: "your-google-ai-studio-api-key-here"  # 你的 Google AI Studio API Key
    models:
      - gemini-1.5-pro
      - gemini-1.5-flash

  deepseek:
    api_key: "your-deepseek-api-key-here"  # 你的 DeepSeek API Key
    # base_url: "https://api.deepseek.com" # DeepSeek 的 API 地址
    models:
      - deepseek-chat

# 技能配置
skills:
  web_search:
    enabled: true
    provider: "tavily"  # 或其他搜索引擎提供商,如 serper, serpapi
    api_key: "your-tavily-api-key-here"  # 需要单独申请

  python_executor:
    enabled: true
    # 安全设置:是否允许执行代码
    safe_mode: true
    # 超时时间(秒)
    timeout: 30

配置项关键说明:

  1. API 密钥安全 :这是最重要的部分。务必从对应平台的官方渠道获取 API Key。
  2. base_url :用于配置 API 中转或自定义端点。如果你使用某些第三方代理服务,可能需要修改此项。
  3. models 列表 :这里列出的模型名,才可以在 --model 参数中使用。请根据你的 API 访问权限填写。
  4. 技能配置 web_search 等功能需要额外的 API 密钥(如 Tavily)。你需要去对应网站注册并获取。

3.3 验证配置

保存配置文件后,运行一个简单命令测试配置是否生效。

# 使用默认模型进行一次快速对话
agent-reach chat --prompt "Hello, who are you?"

# 指定使用 Claude 模型
agent-reach chat --model claude-3-5-sonnet-20241022 --prompt "用中文介绍一下你自己。"

如果配置正确,你将看到模型的回复输出在终端中。如果遇到错误,请跳至本文第 6 节“常见问题与排查思路”。

4. 核心功能实战:从聊天到技能调用

现在,你的 Agent-Reach 已经准备就绪。让我们通过一系列实例,探索其核心功能。

4.1 基础聊天模式

这是最直接的功能,模拟与 ChatGPT 网页版的对话。

单次问答:

agent-reach chat --prompt "Python中如何快速反转一个列表?"

你会得到类似这样的回答:

在Python中,有几种方法可以反转一个列表:

1. 使用 `reverse()` 方法(原地修改):
   ```python
   my_list = [1, 2, 3]
   my_list.reverse()
   print(my_list)  # 输出:[3, 2, 1]
  1. 使用切片操作 [::-1] (创建新列表):

    my_list = [1, 2, 3]
    reversed_list = my_list[::-1]
    print(reversed_list)  # 输出:[3, 2, 1]
    
  2. 使用 reversed() 函数(返回迭代器):

    my_list = [1, 2, 3]
    for item in reversed(my_list):
        print(item)  # 依次输出:3, 2, 1
    # 如果需要列表,可以:list(reversed(my_list))
    

第一种方法会修改原列表,后两种则不会。根据你的需求选择合适的方法。


**交互式对话:**

使用 `-i` 或 `--interactive` 参数进入交互模式,进行多轮对话。

```bash
agent-reach chat --model gpt-4o --interactive

启动后,终端会显示一个提示符(如 > ),你可以持续输入。上下文会被自动维护。

> 我想学习Python的异步编程,应该从哪里开始?
(模型回答...)
> 能给我一个使用asyncio下载多个网页的示例吗?
(模型基于上一轮上下文回答...)
> 退出

输入 退出 quit exit 即可结束交互。

4.2 使用技能(Skills):让 Agent 更强大

技能是 Agent-Reach 的精华。它们允许模型突破纯文本生成的限制,与真实世界互动。

技能1:网络搜索 ( web_search )

在提问时加上 --web-search 参数,Agent 会先使用 Tavily(或其他配置的引擎)搜索网络,再将结果整合到回答中。

agent-reach chat --prompt "今天北京天气怎么样?" --web-search

输出将包含从网络获取的最新天气信息,而不仅仅是模型训练数据中的旧知识。

技能2:Python 代码执行 ( python_executor )

这是一个极其强大的功能。当模型生成代码时,可以指令它直接执行并返回结果。

agent-reach chat --prompt "请编写一个Python函数计算斐波那契数列的前10项,并执行它。" --execute-python

模型会生成类似以下的代码,然后 Agent-Reach 会在一个安全的子进程中执行它,并将输出返回给你。

def fibonacci(n):
    a, b = 0, 1
    result = []
    for _ in range(n):
        result.append(a)
        a, b = b, a + b
    return result

print(fibonacci(10))

执行结果会附加在模型的回答之后:

[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]

组合使用技能:

你可以同时启用多个技能。例如,让模型搜索“最新的机器学习框架”,然后根据搜索结果生成一个示例代码并执行(如果合理)。

agent-reach chat --prompt "找出当前最流行的三个机器学习框架,并用其中一个写一个简单的线性回归示例。" --web-search --execute-python

这个过程完全自动化:搜索 -> 分析 -> 生成代码 -> 执行 -> 呈现结果。

4.3 文件操作与上下文管理

Agent-Reach 可以读取本地文件内容作为对话的上下文,这对于分析代码、文档或日志非常有用。

从文件加载提示词:

# 假设有一个文件 prompt.txt,内容为“分析以下代码的复杂度:”
agent-reach chat --prompt-file ./prompt.txt

将文件内容作为上下文:

更常见的是,让模型分析一个已有的文件。

# 创建一个示例 Python 文件
cat > example.py << 'EOF'
def quick_sort(arr):
    if len(arr) <= 1:
        return arr
    pivot = arr[len(arr) // 2]
    left = [x for x in arr if x < pivot]
    middle = [x for x in arr if x == pivot]
    right = [x for x in arr if x > pivot]
    return quick_sort(left) + middle + quick_sort(right)

print(quick_sort([3,6,8,10,1,2,1]))
EOF

# 让模型分析这个文件
agent-reach chat --prompt "请分析这段代码,说明其算法、时间空间复杂度,并指出可能的优化点。" --file example.py

模型会接收到文件 example.py 的全部内容,并在此基础上进行分析和回答。

保存和加载对话历史:

对于重要的对话,你可以保存下来以便后续回顾或继续。

# 进行一场对话并保存历史
agent-reach chat -i --save-history ./my_conversation.json
# 对话结束后,历史会被保存到指定文件

# 之后可以加载历史,继续对话
agent-reach chat -i --load-history ./my_conversation.json

5. 高级用法与自定义扩展

当你熟悉基础操作后,可以探索更高级的用法,甚至扩展 Agent-Reach 的能力。

5.1 在脚本中集成 Agent-Reach

Agent-Reach 的本质是一个命令行工具,因此可以无缝集成到 Shell 脚本或 Python 脚本中,实现自动化。

Shell 脚本示例:自动生成代码注释

#!/bin/bash
# 脚本名:auto_comment.sh

SOURCE_FILE=$1
if [ -z "$SOURCE_FILE" ]; then
    echo "Usage: $0 <source_file>"
    exit 1
fi

# 使用 agent-reach 分析文件并生成注释
# 将结果输出到新文件
agent-reach chat \
  --model gpt-4o \
  --prompt "请为以下代码的每个函数和复杂逻辑块添加清晰的中文注释。只输出添加了注释的完整代码,不要额外解释。" \
  --file "$SOURCE_FILE" > "${SOURCE_FILE}.commented"

echo "注释已生成到: ${SOURCE_FILE}.commented"

运行: ./auto_comment.sh my_script.py

Python 脚本示例:调用子进程

# 脚本名:call_agent.py
import subprocess
import json

def ask_agent(question, model="gpt-4o-mini"):
    """调用 agent-reach 获取回答"""
    cmd = [
        "agent-reach",
        "chat",
        "--model", model,
        "--prompt", question,
        "--json"  # 获取 JSON 格式输出,便于程序解析
    ]
    try:
        result = subprocess.run(cmd, capture_output=True, text=True, check=True)
        output = json.loads(result.stdout)
        return output.get("response", "No response")
    except subprocess.CalledProcessError as e:
        return f"Error: {e.stderr}"
    except json.JSONDecodeError:
        return result.stdout

if __name__ == "__main__":
    answer = ask_agent("Shell脚本中如何检查一个文件是否存在?")
    print(answer)

5.2 创建自定义技能

如果内置技能不能满足你的需求,你可以编写自己的技能。这需要一些 Python 编程知识。

步骤1:在技能目录中创建新文件

如果你以可编辑模式安装,可以在项目目录的 agent_reach/skills/ 下创建新文件,例如 my_calculator.py

# agent_reach/skills/my_calculator.py
import json
import re
from typing import Dict, Any
from .base_skill import BaseSkill

class MyCalculatorSkill(BaseSkill):
    """一个简单的自定义计算器技能,能处理基础算术表达式。"""
    
    name = "my_calculator"
    description = "计算一个基础算术表达式的结果。输入应为一个字符串,如 '2 + 3 * 4'。"

    def execute(self, input_data: str, **kwargs) -> Dict[str, Any]:
        """
        执行技能。
        Args:
            input_data: 用户输入的算术表达式字符串。
        Returns:
            包含结果或错误的字典。
        """
        # 简单的安全过滤,只允许数字和基础运算符
        if not re.match(r'^[\d\s\+\-\*\/\(\)\.]+$', input_data):
            return {
                "success": False,
                "error": "输入包含非法字符,只支持数字、空格和 + - * / ( ) ."
            }
        
        try:
            # 警告:使用 eval 有安全风险,仅用于示例!
            # 在生产环境中,应使用更安全的表达式求值库(如 ast.literal_eval 或自定义解析器)。
            result = eval(input_data)
            return {
                "success": True,
                "result": result,
                "input": input_data
            }
        except Exception as e:
            return {
                "success": False,
                "error": f"计算失败: {e}",
                "input": input_data
            }

步骤2:注册技能

需要在技能包的 __init__.py 文件中导入你的新技能类。找到 agent_reach/skills/__init__.py 文件,在 __all__ 列表和技能注册部分添加你的类。

# agent_reach/skills/__init__.py (部分内容)
from .web_search import WebSearchSkill
from .python_executor import PythonExecutorSkill
# ... 其他内置技能导入
from .my_calculator import MyCalculatorSkill  # 新增导入

__all__ = [
    "WebSearchSkill",
    "PythonExecutorSkill",
    # ... 
    "MyCalculatorSkill",  # 新增
]

# 在 get_skill 函数或类似的注册逻辑中,确保你的技能被包含
def get_skill(skill_name: str):
    skill_map = {
        "web_search": WebSearchSkill,
        "python_executor": PythonExecutorSkill,
        # ...
        "my_calculator": MyCalculatorSkill,  # 新增映射
    }
    return skill_map.get(skill_name)

步骤3:在配置中启用并测试

config.yaml skills 部分添加配置(虽然这个简单技能可能不需要 API 密钥)。

skills:
  my_calculator:
    enabled: true
  # ... 其他技能

现在,你可以在聊天中通过特定指令或参数来调用这个技能(具体调用方式取决于 Agent-Reach 的技能调用机制,可能需要查看其源码中如何触发技能)。通常,模型在认为需要时会自动调用已启用的技能。

6. 常见问题与排查思路

在使用过程中,你可能会遇到一些错误。以下是常见问题的排查指南。

问题现象 可能原因 排查步骤与解决方案
agent-reach: command not found 1. 安装失败。
2. Python 脚本目录未加入系统 PATH。
1. 重新运行 pip3 install git+https://github.com/panniantong/Agent-Reach.git ,确保无报错。
2. 尝试使用 python3 -m agent_reach.cli 代替 agent-reach
API Error: 401 Invalid Authentication API 密钥错误、过期或未正确配置。 1. 检查 ~/.config/agent_reach/config.yaml 中的 api_key 是否正确, 注意不要有多余空格
2. 前往对应平台确认 API 密钥是否有效、是否有余额或调用权限。
API Error: 429 Rate limit exceeded API 调用频率超限。 1. 等待一段时间再试。
2. 如果是免费额度用尽,需要充值或等待下一个周期重置。
3. 在命令中增加 --delay 参数(如果支持)来降低请求频率。
API Error: 400 ... maximum context length 输入的提示词加上上下文(如文件内容)超出了模型的最大上下文长度。 1. 缩短提示词或减少输入文件的大小。
2. 使用上下文更长的模型(如 claude-3-5-sonnet gpt-4-turbo )。
3. 对长文件进行分段处理。
API Error: 402 Insufficient balance 账户余额不足。 登录对应平台的控制台,查看余额并充值。
Unable to connect to API (Connection refused) 1. 网络问题,无法访问 API 服务器。
2. base_url 配置错误。
3. 本地代理设置冲突。
1. 使用 curl ping 测试网络连通性。
2. 检查 config.yaml 中的 base_url 是否正确。
3. 检查环境变量 HTTP_PROXY / HTTPS_PROXY ,或在配置中设置正确的代理。
Skill ‘web_search‘ execution failed 网络搜索技能配置错误或 API 密钥无效。 1. 确认 config.yaml skills.web_search enabled: true
2. 确认 api_key 有效(如 Tavily 密钥)。
3. 尝试直接在浏览器中访问搜索引擎提供商的 API 测试端点。
Python execution timed out 模型生成的代码陷入死循环或执行时间过长。 1. 检查生成的代码逻辑。
2. 在 config.yaml 中调整 skills.python_executor.timeout 值。
3. 考虑在提示词中要求模型生成更高效或设置超时检查的代码。
模型回复不符合预期 1. 提示词不够清晰。
2. temperature 参数过高导致随机性大。
3. 模型本身能力限制。
1. 优化你的提示词,更具体、明确地提出要求(参见“提示词工程”最佳实践)。
2. 尝试降低 temperature (如设为 0.2)以获得更确定性的输出。
3. 换用更强大的模型(如从 gpt-3.5-turbo 切换到 gpt-4o )。

7. 最佳实践与工程建议

为了更安全、高效地使用 Agent-Reach,请遵循以下建议:

7.1 配置与安全

  1. 密钥管理是重中之重

    • 永远不要将包含真实 API 密钥的 config.yaml 文件提交到 Git 等版本控制系统。务必将其添加到 .gitignore 文件中。
    • 考虑使用环境变量来存储密钥。你可以修改 config.yaml ,使用 api_key: ${ENV_VAR_NAME} 的格式,然后在 shell 中设置环境变量。
    • 为不同的项目或用途创建不同的 API 密钥,并设置合理的用量限制和权限。
  2. 使用版本控制

    • 将你的自定义技能代码、实用的提示词模板和自动化脚本纳入版本控制。
    • 对于团队使用,可以维护一个共享的、不包含密钥的配置模板。

7.2 提示词工程

  1. 明确指令 :在提示词中清晰定义角色、任务和输出格式。例如:“你是一个经验丰富的 Python 代码审查员。请分析以下代码,指出潜在的性能问题和风格问题,并以列表形式给出修改建议。”
  2. 提供示例 :对于复杂任务,在提示词中提供一两个输入输出的例子(Few-shot Learning),能显著提升模型表现。
  3. 分步思考 :对于推理或复杂问题,鼓励模型“一步一步思考”(Chain-of-Thought),这通常能提高答案的准确性和逻辑性。
  4. 设定约束 :明确限制输出长度、格式(如 JSON、Markdown)、语言等。

7.3 生产环境集成

  1. 错误处理与重试 :在自动化脚本中,务必对 agent-reach 的调用进行异常捕获。对于网络超时、速率限制等暂时性错误,实现指数退避重试机制。
  2. 日志记录 :记录每一次调用的模型、提示词、token 消耗和响应,便于后续分析和成本核算。
  3. 成本监控 :定期检查各 AI 平台的控制台,监控 API 调用量和费用,设置预算警报。
  4. 性能考量 :LLM 调用有延迟。在关键路径上避免同步调用,考虑使用异步或队列机制。对于简单任务,优先使用较小、较快的模型(如 gpt-4o-mini , claude-3-haiku )。

7.4 技能使用规范

  1. 代码执行安全 python_executor 技能虽然强大,但存在风险。务必在 safe_mode: true 下运行,并考虑使用 Docker 容器或更严格的沙箱进行隔离,切勿在生产环境中直接执行来源不可信的代码。
  2. 网络搜索验证 :对于 web_search 返回的事实性信息,尤其是涉及重要决策时,应进行交叉验证,因为搜索结果可能包含过时或不准确的信息。
  3. 自定义技能审核 :在编写自定义技能时,必须对输入进行严格的验证和清理,防止注入攻击或其他安全漏洞。

Agent-Reach 将强大的 AI 模型能力带到了命令行这个开发者最熟悉的环境里。通过本文,你应该已经掌握了从安装配置、基础聊天、技能调用到自定义扩展的完整流程。它不仅是个人效率工具,更可以作为构建更复杂 AI 应用的原型测试平台。

下一步,你可以尝试:

  • 将 Agent-Reach 与你的日常开发工具链(如 VS Code Tasks, Makefile)结合。
  • 探索其源码,理解 Agent 调度和工具调用的内部机制。
  • 基于其框架,开发一个解决你特定领域问题(如自动化测试、数据分析报告生成)的专属技能。

实践是学习的最佳途径。现在就在你的终端里输入 agent-reach chat -i ,开始探索吧。如果在使用中遇到本文未覆盖的问题,欢迎在项目的 GitHub Issues 中与社区交流。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐