Skip to main content
pal

PyPI version Python Version License

Simple. Lightweight. Reliable.

pal is a minimal framework for building personal AI assistants — connect a channel, give it tools and memory, and it's ready to work.


Key Features

  • Minimal by design. Agent + Pal + channel — three concepts, no more. The entire framework fits in your head.
  • Persistent out of the box. Conversation history and long-term memory are saved to ~/.pal/ automatically. Restart anytime, pick up where you left off.
  • Memory is the agent's business. The agent decides when to recall and what to note — no hard-coded pipelines, no mandatory hooks.
  • Pluggable everywhere. Swap the LLM (18+ providers via chak), the memory backend, or the channel — each is an independent interface with a one-file implementation.

Quick Start

Installation

pip install palbot

Minimal example — Slack bot in 20 lines

import os
from pal import Pal, Agent
from pal.tools import Bash, Python, Web, Search
from pal.messaging.slack import Slack

agent = Agent(
    model_uri="openai/gpt-4o-mini",
    api_key=os.environ["OPENAI_API_KEY"],
    tools=[Bash(), Python(), Web(), Search()],
)

pal = Pal(
    agent=agent,
    channels=[Slack(
        bot_token=os.environ["SLACK_BOT_TOKEN"],
        app_token=os.environ["SLACK_APP_TOKEN"],
    )],
)
pal.run()

Add long-term memory — 3 extra lines

from pal.memory.seeka import SeekaMemory

mem = SeekaMemory(llm_uri="openai/gpt-4o-mini", llm_api_key=os.environ["OPENAI_API_KEY"])

agent = Agent(..., memory=mem)

That's it. The agent now remembers facts across sessions, recalls relevant context automatically, and stores everything in ~/.pal/memory — no path configuration required.


How It Works

User message
  → Pal receives it from the channel
  → Agent runs: LLM + tools (as many turns as needed)
  → Pal sends the reply
  → Conversation saved to ~/.pal/conversations/
  → Memory consolidated in the background (~/.pal/memory/)

Agent handles the reasoning loop — it calls the LLM, executes tools, and evaluates whether the task is complete. It keeps going until it is.

Pal is the runtime — it wires a channel to an agent, handles concurrency, and triggers background tasks (memory consolidation, conversation persistence) after each turn.

Memory is optional and pluggable. The agent decides when to recall and what to note — memory tools are injected automatically when a memory backend is configured.


Memory

pal ships with a seeka backend. Memory is split across two layers:

Layer What Where
Conversation history Raw LLM message list, persisted across restarts ~/.pal/conversations/{agent_id}.json
Long-term memory Structured facts extracted from conversations, semantic recall ~/.pal/memory/

Both layers are zero-config. The paths exist automatically on first use.

The agent controls memory. It calls note() to record facts and recall() to retrieve them. The runtime calls dream() in the background after each turn to consolidate raw notes into structured memories.

# The agent sees these as tools and decides when to use them:
# note(content)  — save something worth remembering
# recall(query)  — search long-term memory before responding

To add a different memory backend, subclass BaseMemory and implement note, recall, and process.


Channels

Channel Class Notes
Slack pal.messaging.slack.Slack Socket Mode, supports file attachments

More channels coming. To add your own, subclass BaseMessaging.


Agent

Agent(
    model_uri="openai/gpt-4o-mini",   # any chak model URI
    api_key="sk-...",
    system_prompt="...",               # optional
    tools=[...],                       # any chak-compatible tools
    memory=SeekaMemory(...),           # optional
    max_turns=5,                       # max LLM iterations per task
    agent_id="default",                # used for conversation file naming
)

pal uses chak for LLM calls. Any model URI supported by chak works:

URI Provider
openai/gpt-4o-mini OpenAI
anthropic/claude-3-5-sonnet Anthropic
google/gemini-1.5-pro Google Gemini
bailian/qwen-plus Alibaba Bailian
deepseek/deepseek-chat DeepSeek
ollama/llama3.1 Ollama (local)
provider@https://base-url/model Any OpenAI-compatible endpoint

Tools

pal works with any tool supported by chak. The standard library (chak.tools.std) ships ready to use:

Tool What it does
Bash Execute shell commands
Python Run Python code snippets
FileSystem Read, write, edit, list files
Web Fetch and extract web page content
Search Web search (Tavily → Brave → DuckDuckGo)
Http Full HTTP client (GET / POST / PUT / PATCH / DELETE)
Pdf Extract text and tables from PDF files
from pal.tools import Bash, Python, FileSystem, Web, Search, Http, Pdf

agent = Agent(..., tools=[Bash(), Python(), FileSystem(), Web(), Search(), Http(), Pdf()])

Is pal right for you?

pal is a good fit if:

  • You want a working Slack bot (or similar) with tools and memory, not a framework to study.
  • You want the agent to own its reasoning — no hand-coded pipelines, no fixed workflows.
  • You need to ship quickly and keep the codebase readable.

pal is not a good fit if you need multi-tenant deployments, complex routing between specialized agents, or production-grade observability out of the box.


pal

Metadata

Release files for palbot 0.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for palbot 0.1.0
File Size Uploaded Provenance
palbot-0.1.0.tar.gz 27.7 kB With provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for palbot 0.1.0
File Interpreter ABI Platform
palbot-0.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 42.3 kB

Release files / palbot-0.1.0.tar.gz

Download URL palbot-0.1.0.tar.gz
Size 27.7 kB
Tags Source
SHA-256 checksum
How to use checksums
6360d5f3a6a218638b76137af4faa26ebea68d076b7cb9e9880e84822c453fce
BLAKE2b-256 checksum
How to use checksums
513751f37fdccea718416d9df75cf08f96f4f191b0b8ff9283528611dfe9735e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Apr 24, 2026.

Transparency log

Release files / palbot-0.1.0-py3-none-any.whl

Download URL palbot-0.1.0-py3-none-any.whl
Size 14.6 kB
Tags Python 3
SHA-256 checksum
How to use checksums
4898339115fb78fda1c15ccd69a1266f7ab42aa73c33fcc2ad62d2c4ca59160b
BLAKE2b-256 checksum
How to use checksums
9934adf2db820a0969a0ea904c42ac4406ac2f54aa3d601dd514bf79ce5f8d5d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Apr 24, 2026.

Transparency log

Security for palbot 0.1.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for palbot-0.1.0.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Apr 24, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 release files Full provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page