Skip to main content

Local-first AI agent with tools โ€” GUI and CLI

Project description

Pengy ๐Ÿง

A local-first AI agent with tools. Desktop GUI, web UI, and command-line โ€” all backed by the same agent core, talking to any OpenAI-compatible API.

PyPI - Version PyPI - Python Version PyPI - License


What is Pengy?

Pengy is an LLM agent that runs on your own machine. It connects to OpenAI, Ollama, vLLM, Groq, OpenRouter, or any local endpoint, and gives the model a set of tools to operate on your filesystem, run code, search the web, and fetch URLs โ€” all with your approval.

Three interfaces, one agent:

๐Ÿง Pengy Desktop ๐Ÿง Pengy CLI ๐Ÿง Pengy Web
Qt6 GUI with markdown rendering, multi-session sidebar, file attachments Terminal REPL with slash commands, single-shot mode for scripting Flask web UI with Bootstrap, responsive layout, SSE live streaming

All three share the same core โ€” same tools, same chat history, same config. Use whichever fits your flow.


Quick Start

Install

# Everything (GUI + CLI + Web)
pip install pengy[all]

# CLI only
pip install pengy[cli]

# GUI only
pip install pengy[gui]

# Web UI only
pip install pengy[web]

# Minimum (no GUI, no CLI โ€” use as a library)
pip install pengy

Desktop GUI

pengy

CLI (interactive)

pengy-cli

CLI (single-shot)

pengy-cli "What is the capital of France?"
pengy-cli "List all files in /tmp"

Web UI

# Localhost only (default)
pengy-web

# Listen on all interfaces (for nginx reverse proxy)
pengy-web --host 0.0.0.0

# Custom port
pengy-web --host 0.0.0.0 --port 8080

The web UI is designed for single-user personal use. For remote access, put it behind nginx with SSL and HTTP basic auth โ€” Pengy itself has no authentication.


Features

  • OpenAI-compatible โ€” Works with OpenAI, Ollama, vLLM, LM Studio, OpenRouter, Groq, or any local endpoint
  • 11 built-in tools โ€” Read, write, and edit files; run bash (with sudo support) and Python code; search the web and fetch URLs; explore directory trees and search codebases
  • Agentic workflow โ€” The LLM can call multiple tools per turn, chaining them to accomplish complex tasks
  • Tool confirmation โ€” Three modes: YOLO (All) skips all confirmations, Safe auto-approves read-only tools, None confirms everything
  • Context management โ€” Elide old tool results to save context window space; configurable per-chat
  • Token usage display โ€” See prompt/completion token counts after every turn (GUI sidebar + CLI footer)
  • Model discovery โ€” Fetch available models from your endpoint with one click or /models command
  • Multi-session โ€” Create, switch, and delete chat sessions; history saved locally as JSON; shared across all interfaces
  • File attachments โ€” GUI: attach files from the input bar; CLI: use /attach <path> or @path inline syntax
  • Web UI โ€” Responsive Bootstrap interface served by Flask; SSE live streaming; works great on mobile
  • Slash commands (CLI) โ€” /new, /load, /models, /yolo, /model, /list, /delete, /attach, /compact, and more
  • Templated system message โ€” Auto-fills {date}, {username}, {hostname}, {osinfo} at send time
  • Persistent config โ€” Settings and chat history live in ~/.config/pengy/, shared between GUI and CLI

Screenshot

Pengy Interface


Configuration

Desktop: Click โš™ Settings in the sidebar.
CLI: Run /config to view, /model <name> to switch models.
Web: Click โš™ in the top-right navbar.

Setting Description
Base URL API endpoint (e.g. http://localhost:11434/v1 for Ollama)
API Key Your API key (or anything for local endpoints)
Model Model name, e.g. gpt-4o, llama3, gemma
System Message Supports {date}, {username}, {hostname}, {osinfo} placeholders
Tool Confirmation YOLO (All) / Safe Only / None โ€” controls which tools require approval
UI Scale (GUI) 75 / 100 / 125 / 200 % โ€” takes effect on next launch

Tools

Pengy gives the LLM these tools to operate on your machine:

Tool Description
read_file / read_multiple_files Read one or more files at once
write_file Write or overwrite a file
replace_in_file Targeted text replacement (safer than full rewrites)
run_bash Execute shell commands (configurable timeout; sudo password dialog)
run_python Execute Python code (uses the same interpreter/venv as Pengy)
web_search DuckDuckGo web search
download_file Download a URL to ~/Downloads/
fetch_url Fetch a URL's text content into context
directory_tree Visual directory structure listing
search_content Regex search across files in a codebase

API Compatibility

Service Base URL
OpenAI https://api.openai.com/v1
Ollama http://localhost:11434/v1
LM Studio http://localhost:1234/v1
vLLM http://localhost:8000/v1
OpenRouter https://openrouter.ai/api/v1
Groq https://api.groq.com/openai/v1

Project Structure

pengy/
โ”œโ”€โ”€ main.py              # Desktop GUI entry point
โ”œโ”€โ”€ cli/
โ”‚   โ””โ”€โ”€ main.py          # CLI entry point (interactive + single-shot)
โ”œโ”€โ”€ assets/
โ”‚   โ””โ”€โ”€ icon.svg         # App icon
โ”œโ”€โ”€ core/
โ”‚   โ”œโ”€โ”€ config.py        # Settings load/save + system message templating
โ”‚   โ”œโ”€โ”€ chat_manager.py  # Chat session CRUD
โ”‚   โ”œโ”€โ”€ llm_client.py    # API client (generator protocol for tool handling)
โ”‚   โ””โ”€โ”€ tools.py         # Tool definitions and execution
โ”œโ”€โ”€ ui/
โ”‚   โ”œโ”€โ”€ main_window.py   # Main window; wires all signals
โ”‚   โ”œโ”€โ”€ chat_history.py  # Sidebar chat list + quick settings
โ”‚   โ”œโ”€โ”€ chat_view.py     # Markdown chat renderer
โ”‚   โ”œโ”€โ”€ chat_input.py    # Input field + file attachment
โ”‚   โ”œโ”€โ”€ chat_worker.py   # Background thread driving the LLM generator
โ”‚   โ””โ”€โ”€ settings_dialog.py  # Settings dialog
โ””โ”€โ”€ web/
    โ”œโ”€โ”€ app.py           # Flask application (routes, WebWorker, SSE)
    โ”œโ”€โ”€ main.py          # Web entry point (argparse, app.run)
    โ””โ”€โ”€ templates/
        โ”œโ”€โ”€ base.html    # Navbar, sidebar, Bootstrap layout
        โ”œโ”€โ”€ chat.html    # Chat view + JS SSE client
        โ””โ”€โ”€ settings.html # Settings form

Development

Install from source

git clone https://github.com/patw/pengy.git
cd pengy
pip install -e ".[all]"

Running tests

pip install -e ".[all]"
python -m pytest tests/ -v

Dependencies

Package Purpose
PySide6 Qt6 GUI framework
flask Web UI framework
openai OpenAI-compatible API client
markdown Markdown rendering (GUI + Web)
pygments Syntax highlighting (GUI + Web)
ddgs DuckDuckGo web search
rich CLI formatting (tables, panels, markdown)

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pengy-1.2.0.tar.gz (64.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pengy-1.2.0-py3-none-any.whl (63.5 kB view details)

Uploaded Python 3

File details

Details for the file pengy-1.2.0.tar.gz.

File metadata

  • Download URL: pengy-1.2.0.tar.gz
  • Upload date:
  • Size: 64.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.4

File hashes

Hashes for pengy-1.2.0.tar.gz
Algorithm Hash digest
SHA256 48a821d659ae007adffbdb91c6145b8b809a115aa85d8c049255e7aa8d4bd96a
MD5 4a0724c7577dd9afd7fd8690c57dfb88
BLAKE2b-256 845da987782afa566626b3050cb912dfb9307a0f3e358b763797ed15195ef0cf

See more details on using hashes here.

File details

Details for the file pengy-1.2.0-py3-none-any.whl.

File metadata

  • Download URL: pengy-1.2.0-py3-none-any.whl
  • Upload date:
  • Size: 63.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.4

File hashes

Hashes for pengy-1.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 a945cabd8d52d80a182906cef3bbdb1eacdf15fa3db6a2e5c9d460a686826f1b
MD5 425235b1d04e40947ea447a5cd645cb4
BLAKE2b-256 3360b566737b757d483bcc9f1c521ccfdde0c56f65d0fadb030b1a859b013b18

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page