AI-powered web search CLI with LLM tool-calling capabilities
Project description
asky is a command-line AI assistant with web search, local document Q&A, conversation history, and an optional XMPP remote-chat mode.
It runs as asky or ask. You give it a query, it gives you an answer.
What you need to get started
- Access to an OpenAI compatible LLM provider (OpenRouter, Gemini, OpenAI, Antrophic or a local model via LM Studio, Ollama, etc.)
- A search provider for web queries, Asky supports:
New here? Start with the Quick Start guide.
Features
- Multi-model support - define model aliases for any OpenAI-compatible API endpoint and switch between them with
-m. - Web search and tool calling - the model can search the web, fetch URLs, and use the current date to answer questions. Tool calls are visible in the output.
- Deep research mode - iterative retrieval across web sources and local documents, with a vector-indexed local corpus for semantic search.
- Document Q&A - point asky at a PDF, EPUB, or folder of files and ask questions about the content. See Document Q&A.
- Conversation history and sessions - every query is saved locally. Resume any previous conversation with
-c, or use named sticky sessions with-ss. - User memory - save facts across sessions. asky injects relevant memories into future queries automatically.
- Custom tools - expose any local CLI command as a tool the model can call.
- XMPP daemon mode - run
asky --daemonto log into an XMPP account and accept queries over chat from any XMPP client app (phone, desktop, etc.). Includes voice transcription on macOS. - Web Admin Console - authenticated browser interface for persona management, web collection review, and background job monitoring.
- Cross-platform system tray - on macOS, Linux, and Windows, daemon mode adds a tray icon for start/stop control and auto-start at login.
- Playwright browser plugin - fetches pages using a real browser, useful for sites that block standard HTTP clients.
- File prompts - load a prompt from a file with
file://path/to/prompt.txt. - Smart context management - summarizes old conversation turns in the background to stay within model context limits.
Installation
As a CLI tool
This is the typical way to install asky. It gets its own isolated environment managed by uv:
uv tool install asky-cli
Optional extras:
# iTerm2 terminal context integration (macOS)
uv tool install "asky-cli[iterm2]"
# XMPP daemon (text only)
uv tool install "asky-cli[xmpp]"
# Voice transcription (macOS, mlx-whisper)
uv tool install "asky-cli[mlx-whisper]"
# macOS full bundle: iterm2 + mlx-whisper + rumps + slixmpp
uv tool install "asky-cli[mac]"
# System tray icons (Linux/Windows)
uv tool install "asky-cli[tray]"
# Playwright browser plugin
uv tool install "asky-cli[playwright]"
From source:
uv tool install -e .
As a library
If you want to use asky programmatically in your own Python project (see Library Usage Guide):
uv pip install asky-cli
Basic Usage
# Basic query
asky what is the correct temperature for green tea
# Ask about a local document
asky -r path/to/report.pdf "What are the main conclusions?"
# Research mode - web sources
asky -r web "Compare the latest iPhone vs Samsung flagship specs"
# Continue from a previous query
asky -c "~1" explain more
# Persistent named session
asky -ss "Project X" "Let's plan the API structure"
# Use a specific model alias (defined in models.toml)
asky -m gf "Explain quantum entanglement"
# Copy final answer to clipboard
asky -cc "Write a regex to match email addresses"
# Pro-tip: Create a clipboard-first alias for command-only terminal assistance:
# alias al='asky -L -cc -sp "You are a CLI assistant. Answer briefly. When the user asks for a shell command, return only the command text. No markdown, no code fences, no explanation."'
# Run XMPP daemon in the background (menu bar on macOS if supported)
asky --daemon
# Run daemon attached to the terminal
asky --daemon --foreground
# Edit daemon settings interactively
asky --config daemon edit
# Add or edit model aliases
asky --config model add
asky --config model edit gf
# History, sessions, memory
asky history list 20
asky session list
asky memory list
Example output for a query that uses web search:
$ asky "What is the weather in Delft right now?"
Dispatching tool call: web_search with args {'q': 'weather Delft Netherlands'}
Dispatching tool call: get_url_content with args {'urls': [...]}
The weather in Delft, South Holland is currently 45°F, cloudy with showers.
Query completed in 3.88 seconds
Run asky --help for the full list of commands and flags.
Documentation
User guides
- Quick Start - install, configure, first query
- Configuration and Setup - TOML config files, API keys, model aliases, sessions
- Document Q&A - ask questions about local files
- Deep Research Mode (
-r) - multi-source web and local document research - User Memory & Elephant Mode (
-em) - persistent cross-session memory - XMPP Daemon Mode - remote access via XMPP chat, voice transcription
- Custom Tools - expose local CLI commands to the model
- Playwright Browser Plugin - browser-based page retrieval
- Plugin Runtime and Built-in Plugins - plugin system, persona tools, GUI server
- Troubleshooting - common problems and fixes
Developer / advanced
- Library Usage Guide - programmatic usage via
asky.api - Development Guide - project setup, auto-reload, contributing
- Research Evaluation - evaluating retrieval quality across models
Maintainer release flow: bump [project].version in pyproject.toml, push to main, and let the Publish package GitHub Actions workflow run the tests, upload dist/* to a GitHub Release, and publish the same artifacts to PyPI.
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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file asky_cli-0.4.15.tar.gz.
File metadata
- Download URL: asky_cli-0.4.15.tar.gz
- Upload date:
- Size: 767.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bee8fa0c5a45613085de3a772ab1c46fe6faaaba16ae0cf16484b007827f9299
|
|
| MD5 |
fbdb1d9b19cbc2c71cbd45b70dafa6f9
|
|
| BLAKE2b-256 |
363a10f118d3c463dde163c8b1a5e26a9e92b22f0979178210429b0756839a53
|
Provenance
The following attestation bundles were made for asky_cli-0.4.15.tar.gz:
Publisher:
publish-package.yml on evrenesat/asky
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
asky_cli-0.4.15.tar.gz -
Subject digest:
bee8fa0c5a45613085de3a772ab1c46fe6faaaba16ae0cf16484b007827f9299 - Sigstore transparency entry: 1112941932
- Sigstore integration time:
-
Permalink:
evrenesat/asky@ce9cbe7df52f93484894fa05a6ca5438c37c0165 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/evrenesat
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-package.yml@ce9cbe7df52f93484894fa05a6ca5438c37c0165 -
Trigger Event:
push
-
Statement type:
File details
Details for the file asky_cli-0.4.15-py3-none-any.whl.
File metadata
- Download URL: asky_cli-0.4.15-py3-none-any.whl
- Upload date:
- Size: 876.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
34006588f6b33c0ea7d90c76418582df828933ea35de498133f290b9e1ca6c2d
|
|
| MD5 |
f9cd045e7c29e6250ffa178bc8e8d038
|
|
| BLAKE2b-256 |
7c6c517197e73369618ced16a20e08879e0c11264d26c3620f2424c0959fe318
|
Provenance
The following attestation bundles were made for asky_cli-0.4.15-py3-none-any.whl:
Publisher:
publish-package.yml on evrenesat/asky
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
asky_cli-0.4.15-py3-none-any.whl -
Subject digest:
34006588f6b33c0ea7d90c76418582df828933ea35de498133f290b9e1ca6c2d - Sigstore transparency entry: 1112942001
- Sigstore integration time:
-
Permalink:
evrenesat/asky@ce9cbe7df52f93484894fa05a6ca5438c37c0165 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/evrenesat
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-package.yml@ce9cbe7df52f93484894fa05a6ca5438c37c0165 -
Trigger Event:
push
-
Statement type: