🏠 首页 攻略 用 Python 写 AI 命令行工具:3个实用案例手把手教学

用 Python 写 AI 命令行工具:3个实用案例手把手教学

告别网页版AI,在终端里直接调用大模型。本文用Python+Click库教你写AI命令行工具,覆盖文本摘要、代码审查、数据查询三个真实场景。

你有没有试过——打开浏览器、登录网页版AI、粘贴文本、等待回复?

每天重复这个流程,手都点酸了。

如果能把 AI 直接装进终端呢?输入命令,回车出结果。不用切换窗口,不用复制粘贴。

今天教你用 Python 的 Click 库写三个实用的 AI 命令行工具。全程不到 200 行代码,装完就能天天用。

一、为什么要在终端里用 AI

先说几个高频场景:

快速查资料。终端里敲 ai-search "Python async await 用法",结果直接出来。不用切浏览器。

批量处理文件ai-summarize report.md 一行命令生成文档摘要。

代码审查ai-review fix.py 自动检查代码问题并给出修改建议。

这些操作在终端里完成,效率比网页版高很多。尤其是 SSH 到服务器上改代码的时候,谁也不想开浏览器。

二、基础框架:用 Click 搭骨架

先装依赖:

pip install click openai

创建一个 ai-cli.py 文件,搭好基本结构:

import click
from openai import OpenAI

client = OpenAI()

@click.group()
def cli():
    """AI 命令行工具箱"""
    pass

@cli.command()
@click.argument("text")
@click.option("--model", default="gpt-4o", help="使用的模型")
def summarize(text, model):
    """快速总结文本"""
    response = client.chat.completions.create(
        model=model,
        messages=[
            {"role": "system", "content": "你是一个简洁的文本总结助手。请用不超过100字总结以下内容。"},
            {"role": "user", "content": text}
        ]
    )
    click.echo(response.choices[0].message.content)

if __name__ == "__main__":
    cli()

运行效果:

$ python ai-cli.py summarize "人工智能正在改变软件开发的方式..."

就这么简单。一个完整的 AI 命令行工具就出来了。

三、案例一:AI 代码审查工具

这个工具可以审查 Python 代码,找出潜在问题和优化建议。

@cli.command()
@click.argument("file_path", type=click.Path(exists=True))
@click.option("--model", default="claude-sonnet-4-20250514")
@click.option("--strict/--loose", default=False, help="严格模式:只报错误")
def review(file_path, model, strict):
    """审查 Python 文件的代码质量"""
    with open(file_path, "r") as f:
        code = f.read()

    level = "仅报告严重问题" if strict else "报告所有问题和建议"

    response = client.chat.completions.create(
        model=model,
        messages=[
            {
                "role": "system",
                "content": f"你是一个资深Python工程师。请审查以下代码,{level}。用中文回答,每个问题标注行号。"
            },
            {"role": "user", "content": code}
        ],
        temperature=0.3
    )

    click.secho(f"\n📋 代码审查报告 ({model})\n{'─'*40}", fg="cyan")
    click.echo(response.choices[0].message.content)

使用方式:

# 宽松模式:所有建议
python ai-cli.py review main.py

# 严格模式:只看错误
python ai-cli.py review --strict main.py

关键点:把 temperature 设低(0.3),让输出更稳定。代码审查不需要创意,需要准确。

四、案例二:智能日志分析

服务器上的日志文件动不动几百 MB,肉眼翻根本看不完。用 AI 帮你找问题:

@cli.command()
@click.argument("log_file", type=click.Path(exists=True))
@click.option("--error-only", is_flag=True, help="只显示错误相关分析")
def analyze(log_file, error_only):
    """分析日志文件,提取关键信息"""
    # 只读最后 5000 行,避免内存爆炸
    with open(log_file, "r") as f:
        lines = f.readlines()[-5000:]
    content = "".join(lines)

    prompt = "请分析以下日志文件:\n1. 统计错误数量\n2. 找出最常见的错误类型\n3. 推测可能的原因\n4. 给出修复建议"
    if error_only:
        prompt = "只分析日志中的错误条目,忽略正常日志。"

    response = client.chat.completions.create(
        model="gpt-4o",
        messages=[
            {"role": "system", "content": "你是一个运维专家。请分析日志并提供可操作的修复建议。"},
            {"role": "user", "content": f"{prompt}\n\n日志内容:\n{content}"}
        ]
    )

    click.echo(response.choices[0].message.content)

使用方式:

# 完整分析
python ai-cli.py analyze /var/log/app.log

# 只看错误
python ai-cli.py analyze --error-only /var/log/app.log

注意:日志文件可能很大,所以只读最后 5000 行。超出部分让 AI 自己判断需不需要。

五、案例三:AI 搜索引擎

在终端里搜索知识,比打开浏览器快多了:

@cli.command()
@click.argument("query", nargs=-1, required=True)
@click.option("--model", default="gpt-4o")
@click.option("--max-length", default=300, help="回答最大长度(字符)")
def search(*query, model, max_length):
    """用 AI 搜索知识"""
    question = " ".join(query)

    response = client.chat.completions.create(
        model=model,
        messages=[
            {
                "role": "system",
                "content": f"你是一个知识问答助手。回答要简洁实用,控制在{max_length}字以内。不要编造你不知道的信息。"
            },
            {"role": "user", "content": question}
        ],
        max_tokens=max_length
    )

    result = response.choices[0].message.content
    click.secho(f"🔍 搜索: {question}\n", fg="green")
    click.echo(result)

使用方式:

python ai-cli.py search "Python 中 list 和 tuple 的区别"
python ai-cli.py search "Docker volume 和 bind mount 哪个更好"

六、让工具更好用的技巧

颜色输出

click.secho() 替代 print(),给不同级别的消息加颜色:

click.secho("错误:", fg="red", bold=True)
click.secho("警告:", fg="yellow")
click.secho("成功:", fg="green")

缓存结果

同一个问题没必要每次都调 API。加个简单的文件缓存:

import hashlib
import json
from pathlib import Path

CACHE_DIR = Path.home() / ".ai-cli-cache"

def cached_call(prompt, model):
    cache_key = hashlib.md5(f"{prompt}:{model}".encode()).hexdigest()
    cache_file = CACHE_DIR / f"{cache_key}.json"

    if cache_file.exists():
        with open(cache_file) as f:
            return json.load(f)["result"]

    response = client.chat.completions.create(
        model=model,
        messages=[{"role": "user", "content": prompt}]
    )

    result = response.choices[0].message.content
    CACHE_DIR.mkdir(exist_ok=True)
    with open(cache_file, "w") as f:
        json.dump({"prompt": prompt, "result": result}, f)

    return result

缓存有效期默认 24 小时。同一个问题一天内第二次问,直接返回缓存结果,不花 API 钱。

做成系统命令

不想每次敲 python ai-cli.py?把它装成全局命令:

pip install -e .

setup.py 里加一行:

setup(
    name="ai-cli",
    entry_points={
        "console_scripts": [
            "ai=ai_cli:cli",
        ],
    },
)

装完之后直接敲 ai summarize "hello" 就行。

七、进阶:接入更多模型

上面用的是 OpenAI 的 SDK。如果你想同时支持 Claude、Gemini,只需要改两行:

from litellm import completion  # 用 LiteLLM 统一接口

response = completion(
    model="anthropic/claude-sonnet-4-20250514",
    messages=[{"role": "user", "content": text}]
)

这样你的 CLI 工具就能无缝切换任意模型,不用改业务逻辑。

八、完整项目结构

ai-cli/
├── ai_cli.py          # 主程序
├── setup.py           # 安装配置
├── requirements.txt   # 依赖列表
└── README.md          # 使用说明

一个标准的 Python 小工具结构。方便分享,也方便自己维护。

写在最后

这三个工具加起来不到 150 行代码,但能解决日常开发中的很多重复劳动。

好的工具不一定复杂。能在终端里一键完成的操作,就别开浏览器。

你平时在终端里用什么 AI 工具?有没有更好的玩法?