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 and command-line โ€” both 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.

Two interfaces, one agent:

๐Ÿง Pengy Desktop ๐Ÿง Pengy CLI
Qt6 GUI with markdown rendering, multi-session sidebar, file attachments Terminal REPL with slash commands, single-shot mode for scripting

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


Quick Start

Install

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

# CLI only
pip install pengy[cli]

# GUI only
pip install pengy[gui]

# 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"

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
  • File attachments โ€” GUI: attach files from the input bar; CLI: use /attach <path> or @path inline syntax
  • 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.

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

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
openai OpenAI-compatible API client
markdown Markdown rendering
pygments Syntax highlighting
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.0.2.tar.gz (51.1 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.0.2-py3-none-any.whl (48.4 kB view details)

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for pengy-1.0.2.tar.gz
Algorithm Hash digest
SHA256 cf9934e7e7a6a0f56c02f4c57721074cd0544b4d694bdc78586e2c10fea3cd48
MD5 33ef5bf36b809c2efc250c723d5a1040
BLAKE2b-256 b77ec77761887b7a8897b341f797cb4c93298b75d54a80164c5233c6bff3c518

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pengy-1.0.2-py3-none-any.whl
  • Upload date:
  • Size: 48.4 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.0.2-py3-none-any.whl
Algorithm Hash digest
SHA256 64a9965599668576a754425bf29d56e7daf08fda7e0464df20c7ba4ac604f879
MD5 49fffe120f1e0fc6ad1535241819ddaa
BLAKE2b-256 9320fa915686d189577d4804000843da61149d608513df7474c289919f7eac49

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