你有没有试过——打开浏览器、登录网页版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 工具?有没有更好的玩法?