📝 LLM и AI

Typer: CLI-приложения без boilerplate

P
Автор
Pyland
📅
Опубликовано
30.06.2026
⏱️
Время чтения
1 мин
👁️
Просмотров
83
🌿
Уровень
Средний
🐦 💼 ✈️

Typer создаёт CLI из аннотаций типов Python. Никаких argparse, никакого ручного парсинга — только декораторы и типы.

Установка

uv add typer

Базовое приложение

import typer

app = typer.Typer()

@app.command()
def greet(name: str, times: int = 1):
    """Приветствует пользователя."""
    for _ in range(times):
        typer.echo(f"Привет, {name}!")

if __name__ == "__main__":
    app()
uv run python main.py Alice          # Привет, Alice!
uv run python main.py Alice --times 3  # Три раза
uv run python main.py --help         # Автодокументация

Несколько команд

import typer

app = typer.Typer(help="AI-агент CLI")

@app.command()
def chat(message: str = typer.Argument(..., help="Сообщение для Claude")):
    """Отправить сообщение Claude."""
    typer.echo(f"Отправляю: {message}")

@app.command()
def history(limit: int = typer.Option(10, help="Количество сообщений")):
    """Показать историю диалогов."""
    typer.echo(f"Последние {limit} сообщений")

@app.command()
def clear():
    """Очистить историю."""
    typer.echo("История очищена")

if __name__ == "__main__":
    app()
uv run python main.py chat "Привет!"
uv run python main.py history --limit 5
uv run python main.py clear

Argument vs Option

@app.command()
def analyze(
    text: str = typer.Argument(...),           # обязательный позиционный
    model: str = typer.Option("claude-sonnet-4-6"),  # --model
    verbose: bool = typer.Option(False, "--verbose", "-v"),  # флаг
):
    pass
  • Argument(...) — позиционный, обязательный
  • Argument("default") — позиционный с дефолтом
  • Option(default) — именованный --param value

Цвета и форматирование

from rich.console import Console

console = Console()

@app.command()
def status():
    console.print("[bold green]✓[/] Агент запущен")
    console.print("[bold red]✗[/] Ошибка подключения")
    typer.echo(typer.style("Готово", fg=typer.colors.GREEN, bold=True))

Интерактивный ввод

@app.command()
def setup():
    api_key = typer.prompt("Введи API ключ", hide_input=True)
    confirm = typer.confirm("Сохранить в .env?")
    if confirm:
        typer.echo("Сохранено!")

Ваша реакция на статью

💬 Комментарии (0)

🔐 Войдите в систему, чтобы оставить комментарий
🚪 Войти
💭

Комментариев пока нет

Станьте первым, кто поделится мнением об этой статье!

🔗 Похожие

Похожие статьи

Продолжите изучение с этими материалами

📝

httpx: современный HTTP-клиент для Python

httpx — HTTP-клиент нового поколения. Интерфейс похож на requests, но с поддержкой async/await из коробки.

📅 30.06.2026 👁️ 108
📝

AI-агенты: ReAct loop и автономные действия

Чат-бот отвечает на вопросы. Агент — действует: вызывает инструменты, получает реальные данные и использует их...

📅 30.06.2026 👁️ 99
📝

Нарезка документов на чанки для RAG

Эмбеддинг длинного текста усредняет смыслы — конкретный вопрос не найдёт нужный абзац. Решение: нарезать документ...

📅 30.06.2026 👁️ 100

Понравилась статья?

Подпишитесь на наши обновления и получайте новые статьи первыми. Развивайтесь вместе с PyLand!