Metadata-Version: 2.4
Name: pythinker-ai
Version: 2.5.2
Summary: Pythinker — a tiny agent framework with built-in chat channels, memory, MCP, and an OpenAI-compatible API.
Project-URL: Homepage, https://pythinker.com
Project-URL: Repository, https://github.com/mohamed-elkholy95/Pythinker-ai
Project-URL: Documentation, https://github.com/mohamed-elkholy95/Pythinker-ai/tree/main/docs
Project-URL: Issues, https://github.com/mohamed-elkholy95/Pythinker-ai/issues
Project-URL: Changelog, https://github.com/mohamed-elkholy95/Pythinker-ai/releases
Author-email: Mohamed Elkholy <moelkholy1995@gmail.com>
Maintainer-email: Mohamed Elkholy <moelkholy1995@gmail.com>
License: MIT
License-File: LICENSE
License-File: THIRD_PARTY_NOTICES.md
Keywords: agent,ai,anthropic,assistant,chatbot,discord,llm,mcp,openai,slack,telegram,whatsapp
Classifier: Development Status :: 3 - Alpha
Classifier: Framework :: AsyncIO
Classifier: Intended Audience :: Developers
Classifier: Intended Audience :: End Users/Desktop
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: MacOS
Classifier: Operating System :: Microsoft :: Windows
Classifier: Operating System :: POSIX :: Linux
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3 :: Only
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Programming Language :: Python :: 3.14
Classifier: Topic :: Communications :: Chat
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
Classifier: Topic :: Software Development :: Libraries :: Python Modules
Classifier: Typing :: Typed
Requires-Python: >=3.11
Requires-Dist: anthropic<1.0.0,>=0.45.0
Requires-Dist: chardet<6.0.0,>=3.0.2
Requires-Dist: croniter<7.0.0,>=6.0.0
Requires-Dist: ddgs<10.0.0,>=9.5.5
Requires-Dist: dulwich<1.0.0,>=0.22.0
Requires-Dist: filelock>=3.25.2
Requires-Dist: httpx<1.0.0,>=0.28.0
Requires-Dist: jinja2<4.0.0,>=3.1.0
Requires-Dist: json-repair<1.0.0,>=0.57.0
Requires-Dist: loguru<1.0.0,>=0.7.3
Requires-Dist: mcp<2.0.0,>=1.26.0
Requires-Dist: oauth-cli-kit<1.0.0,>=0.1.3
Requires-Dist: openai>=2.8.0
Requires-Dist: openpyxl<4.0.0,>=3.1.0
Requires-Dist: packaging<26,>=24.0
Requires-Dist: playwright<2,>=1.48
Requires-Dist: prompt-toolkit<4.0.0,>=3.0.50
Requires-Dist: pydantic-settings<3.0.0,>=2.12.0
Requires-Dist: pydantic<3.0.0,>=2.12.0
Requires-Dist: pypdf<6.0.0,>=5.0.0
Requires-Dist: python-docx<2.0.0,>=1.1.0
Requires-Dist: python-pptx<2.0.0,>=1.0.0
Requires-Dist: python-socks[asyncio]<3.0.0,>=2.8.0; sys_platform != 'win32'
Requires-Dist: python-telegram-bot[socks]<23.0,>=22.6
Requires-Dist: pyyaml<7.0.0,>=6.0
Requires-Dist: questionary<3.0.0,>=2.0.0
Requires-Dist: readability-lxml<1.0.0,>=0.8.4
Requires-Dist: rich<15.0.0,>=14.0.0
Requires-Dist: slack-sdk<4.0.0,>=3.39.0
Requires-Dist: slackify-markdown<1.0.0,>=0.2.0
Requires-Dist: socksio<2.0.0,>=1.0.0
Requires-Dist: tiktoken<1.0.0,>=0.12.0
Requires-Dist: typer<1.0.0,>=0.20.0
Requires-Dist: tzdata; sys_platform == 'win32'
Requires-Dist: websocket-client<2.0.0,>=1.9.0
Requires-Dist: websockets<17.0,>=16.0
Provides-Extra: api
Requires-Dist: aiohttp<4.0.0,>=3.9.0; extra == 'api'
Provides-Extra: browser
Provides-Extra: dev
Requires-Dist: aiohttp<4.0.0,>=3.9.0; extra == 'dev'
Requires-Dist: pymupdf>=1.25.0; extra == 'dev'
Requires-Dist: pytest-asyncio<2.0.0,>=1.3.0; extra == 'dev'
Requires-Dist: pytest-cov<7.0.0,>=6.0.0; extra == 'dev'
Requires-Dist: pytest-httpx<1.0.0,>=0.30.0; extra == 'dev'
Requires-Dist: pytest<10.0.0,>=9.0.0; extra == 'dev'
Requires-Dist: ruff>=0.1.0; extra == 'dev'
Provides-Extra: discord
Requires-Dist: discord-py<3.0.0,>=2.5.2; extra == 'discord'
Provides-Extra: langsmith
Requires-Dist: langsmith>=0.1.0; extra == 'langsmith'
Provides-Extra: matrix
Requires-Dist: matrix-nio[e2e]>=0.25.2; (sys_platform != 'win32') and extra == 'matrix'
Requires-Dist: mistune<4.0.0,>=3.0.0; extra == 'matrix'
Requires-Dist: nh3<1.0.0,>=0.2.17; extra == 'matrix'
Provides-Extra: msteams
Requires-Dist: cryptography>=41.0; extra == 'msteams'
Requires-Dist: pyjwt<3.0,>=2.0; extra == 'msteams'
Provides-Extra: pdf
Requires-Dist: pymupdf>=1.25.0; extra == 'pdf'
Provides-Extra: reports
Requires-Dist: reportlab<5.0.0,>=4.0.0; extra == 'reports'
Description-Content-Type: text/markdown

<p align="center">
  <img src="https://cdn.jsdelivr.net/gh/mohamed-elkholy95/Pythinker-ai@main/webui/public/brand/icon.svg" alt="Pythinker" width="180">
</p>

<h1 align="center"> Pythinker</h1>

<div align="center">
  <p>
    <a href="https://pypi.org/project/pythinker-ai/"><img src="https://img.shields.io/pypi/v/pythinker-ai?cacheSeconds=300" alt="PyPI"></a>
    <a href="https://pepy.tech/projects/pythinker-ai"><img src="https://img.shields.io/pepy/dt/pythinker-ai?label=downloads&color=%2312b76a&cacheSeconds=600" alt="Downloads"></a>
    <img src="https://img.shields.io/badge/python-%E2%89%A53.11-blue" alt="Python">
    <img src="https://img.shields.io/badge/license-MIT-green" alt="License">
  </p>
</div>

🤖 **Pythinker** is an open-source tiny agent framework. It keeps the core agent loop compact and readable while still supporting chat channels, long-term memory, MCP, and practical deployment paths — so you can go from local setup to a long-running personal agent with minimal overhead.

> Powered by a tiny, multiplexing agent loop: one Python process listens to Slack, Telegram, Discord, WhatsApp, Matrix, MS Teams, email, a WebSocket WebUI, and an OpenAI-compatible HTTP API — all backed by a single session-scoped memory layer.

> **What's new in 2.5.2** — Live file-edit chips in the WebUI now stream added/deleted line counts while the model is still emitting tool-call JSON, with a turn-scoped cluster above the assistant bubble, a read-only file viewer, and refresh-survival. New `agents.defaults.fallbackModels` drives transparent provider failover with a circuit breaker and a WebUI toast; Config Workbench gains live secret-mask hints and a pending-restart banner; WhatsApp media, bridge port handling, and reconnect backoff are hardened. See the [changelog](CHANGELOG.md) for details.

## 💡 Key Features

- **Tiny agent** — a compact readable core. Stable long-running behavior without orchestration sprawl.
- **Channel-agnostic** — Slack, Telegram, Discord, WhatsApp, Matrix, MS Teams, email, WebSocket, plus an OpenAI-compatible HTTP API.
- **Full-screen TUI** — `pythinker tui` (alias `chat`) opens a `prompt_toolkit` chat with live streaming, slash-command pickers (`/model`, `/provider`, `/sessions`, `/theme`, `/help`, `/status`), fuzzy search, themable chrome (default + monochrome), and Ctrl+C cancellation of in-flight turns.
- **Provider-rich** — 25+ LLM providers (Anthropic, OpenAI, Azure OpenAI, OpenAI Codex, GitHub Copilot, Qwen/DashScope, MiniMax, VolcEngine, Moonshot, DeepSeek, StepFun, and more) behind a single interface.
- **Provider hot-reload** — edits to model / provider / API key in `~/.pythinker/config.json` land at the next turn boundary. No restart of the SDK or gateway. Same-signature snapshots short-circuit; broken configs are logged and swallowed so an in-flight session can't crash on a typo.
- **Headless browser tool** *(opt-in)* — drives Playwright-managed Chromium for JavaScript-rendered pages, click/form flows, screenshots, and DOM snapshots. `mode="auto"` launches a packaged headless Chromium without Docker; `mode="cdp"` connects to an external service for hardened deployments. First-use Chromium binary installs lazily, with idle eviction, per-context page caps, SSRF route handling, and turn-boundary hot reload of browser config.
- **Governed-execution runtime** *(off by default)* — opt-in `RuntimeConfig` wires a `PolicyService` (allow-lists from agent manifests, per-turn budgets, recursion depth), a `ToolEgressGateway` chokepoint, an `AgentRegistry` directory loader, `RequestContext` + `BudgetCounters` plumbing, and a pluggable `TelemetrySink` (loguru / JSONL / composite). When the loader is `None` and policy is off, the runtime is bit-for-bit identical to the legacy path.
- **Autonomous subagent tracking** — spawned subagents are first-class task records with durable output under `.pythinker/task-results/`. Pick a role at spawn time — `coder` (full tools), `explore` (read-only navigation), or `plan` (planning-only, no write/edit/shell) — and use `/tasks`, `/task-output <task_id>`, and `/task-stop <task_id>` to inspect or stop background work from chat.
- **Memory that learns** — a two-phase "Dream" process consolidates long-term memory into `MEMORY.md` / `SOUL.md` / `USER.md`, auto-versioned with pure-Python git.
- **Skills & MCP** — bundled skills (GitHub, cron, weather, tmux, summarize, skill-creator, …) plus first-class [Model Context Protocol](https://modelcontextprotocol.io/) tool access with defensive HTTP probing and provider-safe tool names.
- **Research-grade PDF reports** — opt-in `make_pdf` tool renders structured Markdown to a styled PDF via ReportLab (`pip install 'pythinker-ai[reports]'`).
- **Safer channel ingress** — chat/email adapters apply `allowFrom` before costly side effects like media downloads, attachment extraction, or voice transcription; Matrix also drops replayed pre-startup events.
- **Sandboxed shell** — every command is wrapped in a bubblewrap sandbox on Linux; file tools enforce workspace boundaries.
- **Hackable** — the Python package is ~58k LOC with zero monolithic orchestration layer. Read it, fork it, extend it.

## 📦 Install

> **Pythinker requires Python 3.11 or newer.** Check your version with `python3 --version`. If yours is older, follow the per-OS steps below first.

### 1. Install Python 3.11+ (skip if you already have it)

<details>
<summary><b>macOS</b></summary>

```bash
# Recommended — Homebrew (https://brew.sh)
brew install python@3.13

# Or download an installer from python.org:
#   https://www.python.org/downloads/macos/
# After install, verify:
python3 --version    # should print 3.11 or newer
```
</details>

<details>
<summary><b>Linux</b></summary>

```bash
# Debian / Ubuntu
sudo apt update && sudo apt install -y python3.13 python3.13-venv python3-pip

# Fedora / RHEL / Rocky
sudo dnf install -y python3.13 python3-pip

# Arch
sudo pacman -S python python-pip

# Verify
python3 --version    # should print 3.11 or newer
```

If your distro's repos don't ship 3.11+, install [pyenv](https://github.com/pyenv/pyenv#installation) or use the `uv` flow below — `uv` will fetch a managed Python automatically.
</details>

<details>
<summary><b>Windows</b></summary>

```powershell
# Recommended — winget (built into Windows 10/11)
winget install Python.Python.3.13

# Or download an installer from python.org:
#   https://www.python.org/downloads/windows/
# At the bottom of the installer, tick "Add python.exe to PATH" before clicking Install.

# Verify (open a new PowerShell):
python --version    # should print 3.11 or newer
```

If `python` isn't found, restart your shell (or sign out / back in) so the new `PATH` takes effect.
</details>

### 2. Install Pythinker

```bash
uv tool install pythinker-ai
```

This installs Pythinker into an isolated environment and puts `pythinker` on your `PATH`. [uv](https://docs.astral.sh/uv/) handles Python, PATH, and upgrades for you — and will fetch a managed Python 3.11+ if your system doesn't have one.

<details>
<summary>Don't have <code>uv</code>?</summary>

```bash
# macOS / Linux / WSL:
curl -LsSf https://astral.sh/uv/install.sh | sh

# Windows (PowerShell):
powershell -c "irm https://astral.sh/uv/install.ps1 | iex"
```

Restart your shell so the new `PATH` is picked up, then re-run `uv tool install pythinker-ai`.
</details>

<details>
<summary>Prefer <code>pipx</code>, plain <code>pip</code>, or source?</summary>

```bash
# pipx (equivalent to uv tool install, slower):
pipx install pythinker-ai

# Plain pip (last resort — you may need to add ~/.local/bin to PATH):
pip install --user pythinker-ai

# From source (contributors only):
git clone git@github.com:mohamed-elkholy95/Pythinker-ai.git
cd Pythinker-ai && uv sync --all-extras
```

If `pythinker` isn't found after install, run `pythinker doctor` (via `python -m pythinker doctor` if needed) for diagnostics.
</details>

### 3. Optional extras

Pythinker ships with the Python browser automation library needed by the
`browser` tool. Optional extras are for add-on channels and heavier document
features:

```bash
uv tool install 'pythinker-ai[reports]'   # Markdown → PDF reports (research/report deliverables)
uv tool install 'pythinker-ai[matrix]'    # Matrix channel (E2E messaging)
uv tool install 'pythinker-ai[discord]'   # Discord channel
uv tool install 'pythinker-ai[msteams]'   # Microsoft Teams channel
uv tool install 'pythinker-ai[pdf]'       # Read PDF files (PyMuPDF)
uv tool install 'pythinker-ai[api]'       # OpenAI-compatible HTTP server
# Combine: uv tool install 'pythinker-ai[reports,discord,api]'
```

The historical `pythinker-ai[browser]` extra is still accepted as a
compatibility alias, but it no longer adds packages. Enable the browser tool in
config with `tools.web.browser.enable=true`; the managed Chromium binary is
installed lazily on first browser use when allowed, or explicitly with
`python -m playwright install chromium`.

### 4. Install / pin a specific version

`pythinker-ai` follows [SemVer](https://semver.org/) — major-version
upgrades **are not** auto-installed. To pin or to opt into a major bump,
use the explicit pin form for your install method:

| Goal | Command |
|---|---|
| Pin exactly `2.0.0` (uv tool — recommended) | `uv tool install --reinstall "pythinker-ai==2.0.0"` |
| Pin exactly `2.0.0` (pipx) | `pipx install --force "pythinker-ai==2.0.0"` |
| Pin exactly `2.0.0` (plain pip) | `python -m pip install --force-reinstall "pythinker-ai==2.0.0"` |
| Stay at the latest stable release | `pythinker upgrade` |
| From inside pythinker, target a specific version | `pythinker update --target 2.0.0 -y` |

`pip install -U pythinker-ai==2.0.0` works too, but it's semantically
noisy: the **exact pin** controls the version, not `-U`. `pythinker
upgrade` will refuse to cross a major version (e.g. `1.x → 2.x`)
without an explicit `pythinker update --target` opt-in.

## 🚀 Quick Start

```bash
pythinker onboard                           # write a config at ~/.pythinker/config.json
pythinker provider login openai-codex       # OAuth sign-in (the default provider)
pythinker agent                             # interactive CLI chat
pythinker tui                               # full-screen interactive chat (alias: chat)
```

`pythinker onboard` ships a config preconfigured for **OpenAI Codex via ChatGPT OAuth** (no API key needed). To use a different provider/model, edit `~/.pythinker/config.json` — see [Configuration](https://github.com/mohamed-elkholy95/Pythinker-ai/blob/main/docs/configuration.md) for the full catalog of 25+ providers.

Want several independent agents on one host? `pythinker agents` lays out per-agent configs under `~/.pythinker/agents/<name>/` with isolated workspace, history, and memory; pass `--agent <name>` to any subcommand to target one.

- Want different LLM providers, web search, MCP, security settings, or more config options? See [Configuration](https://github.com/mohamed-elkholy95/Pythinker-ai/blob/main/docs/configuration.md).
- Want to run Pythinker in chat apps like Telegram, Discord, Slack, WhatsApp, or Matrix? See [Chat Apps](https://github.com/mohamed-elkholy95/Pythinker-ai/blob/main/docs/chat-apps.md).
- Want Docker or Linux service deployment? See [Deployment](https://github.com/mohamed-elkholy95/Pythinker-ai/blob/main/docs/deployment.md).
- Want governed-execution (policy allow-lists, budgets, telemetry) for hardened deployments? See [Architecture §5.X — `pythinker/runtime/`](https://github.com/mohamed-elkholy95/Pythinker-ai/blob/main/docs/ARCHITECTURE.md). The layer is opt-in via `runtime.policyEnabled` in `config.json`.

## 🧠 Agent Runtime Controls

Pythinker can launch subagents for background coding, research, and maintenance work. The runtime now tracks those subagents as autonomous tasks instead of relying on chat text alone.

| Command | What it does |
|---|---|
| `/tasks` | List active and recent autonomous tasks for the current session |
| `/task-output <task_id>` | Show the latest bounded output tail for a task |
| `/task-stop <task_id>` | Cancel a running subagent by id |

Task output is written to `.pythinker/task-results/`, so large results do not flood the conversation and recovered output can still be inspected after a process restart. In-memory records are session-scoped; restart-recovered orphan output is workspace-wide by design for Pythinker's single-user/local deployment model.

## 🖥️ TUI

`pythinker tui` (alias `pythinker chat`) opens a full-screen `prompt_toolkit` interface for interactive sessions — a step up from `pythinker agent`'s line-by-line REPL.

```bash
pythinker tui                               # opens with the default theme
pythinker tui --theme monochrome            # high-contrast / accessibility-friendly
pythinker tui --workspace ~/work/agent      # override per-session workspace
pythinker tui --logs ~/.pythinker/tui.log   # mirror loguru output to a file
```

**Layout.** A persistent chat pane (streamed assistant tokens render live with markdown swap-in once the turn ends), a status bar showing session/model/provider/iteration count, a hint footer for the current keymap, and a multiline editor with slash-command autocomplete.

**Slash commands.** Open in-app overlays for everything you'd normally configure on the CLI:

| Command | Opens |
|---|---|
| `/help` | Built-in cheat sheet |
| `/status` | Live snapshot — session key, model, provider, message count, recent activity |
| `/sessions` | Fuzzy-pick from past sessions and resume |
| `/model` | Fuzzy-pick a model from the active provider |
| `/provider` | Switch LLM provider |
| `/theme` | Swap between `default` and `monochrome` themes (persisted to `cli.tui.theme`) |
| `/mcp` | Show MCP status — configured servers, connected servers, registered tools; `/mcp reconnect` reloads MCP config and reconnects |
| `/login` / `/logout` | OAuth sign-in / sign-out for providers like OpenAI Codex and GitHub Copilot, with in-terminal prompts |
| `/init` | Generate a tuned `AGENTS.md` for the current workspace from the bundled template |
| `/clear` | Clear the chat pane (`/clear --hard` also wipes session memory) |
| `/exit` | Quit |

Pickers support fuzzy search — start typing to filter, ↑/↓ to navigate, Enter to commit, Esc to dismiss.

**Keymap.**

| Key | Action |
|---|---|
| `Enter` | Submit message |
| `Ctrl+J` | Newline inside the editor |
| `Ctrl+C` | Cancel the in-flight turn (or quit when idle) |
| `Esc` | Close the active overlay / picker |
| `↑` / `↓` | Move cursor in pickers; PageUp / PageDown for 5-step jumps |

**Theming.** Two themes ship by default. Set `cli.tui.theme` in `~/.pythinker/config.json` or pass `--theme`. Both themes provide separate prompt_toolkit chrome styles and Rich content styles so the chat panel and the surrounding UI stay visually consistent.

## 🧪 WebUI (Development)

> [!NOTE]
> The WebUI development workflow currently requires a source checkout and is not yet shipped together with the official packaged release. See the [WebUI README](https://github.com/mohamed-elkholy95/Pythinker-ai/blob/main/webui/README.md) for full WebUI development docs and build steps.

**1. Enable the WebSocket channel in `~/.pythinker/config.json`**

```json
{ "channels": { "websocket": { "enabled": true } } }
```

**2. Start the gateway**

```bash
pythinker gateway
```

**3. Start the WebUI dev server**

```bash
cd webui
bun install
bun run dev
```

## 🏗️ Architecture

<p align="center">
  <img src="https://cdn.jsdelivr.net/gh/mohamed-elkholy95/Pythinker-ai@main/webui/public/brand/arctecture.webp" alt="Pythinker architecture" width="800">
</p>

🤖 Pythinker stays tiny by centering everything around a tiny agent loop: messages come in from chat apps, the LLM decides when tools are needed, and memory or skills are pulled in only as context instead of becoming a heavy orchestration layer. That keeps the core path readable and easy to extend, while still letting you add channels, tools, memory, and deployment options without turning the system into a monolith.

See [`docs/ARCHITECTURE.md`](https://github.com/mohamed-elkholy95/Pythinker-ai/blob/main/docs/ARCHITECTURE.md) for a forensic walkthrough of the runtime.

## ✨ Features

<table align="center">
  <tr align="center">
    <th><p align="center">📈 24/7 Real-Time Market Analysis</p></th>
    <th><p align="center">🚀 Full-Stack Software Engineer</p></th>
    <th><p align="center">📅 Smart Daily Routine Manager</p></th>
    <th><p align="center">📚 Personal Knowledge Assistant</p></th>
  </tr>
  <tr>
    <td align="center">Discovery • Insights • Trends</td>
    <td align="center">Develop • Deploy • Scale</td>
    <td align="center">Schedule • Automate • Organize</td>
    <td align="center">Learn • Memory • Reasoning</td>
  </tr>
</table>

## 📚 Docs

Browse the [repo docs](https://github.com/mohamed-elkholy95/Pythinker-ai/blob/main/docs/README.md) for the current GitHub development version.

- Talk to Pythinker from familiar chat apps: [Chat Apps](https://github.com/mohamed-elkholy95/Pythinker-ai/blob/main/docs/chat-apps.md)
- Configure providers, web search, MCP, and runtime behavior: [Configuration](https://github.com/mohamed-elkholy95/Pythinker-ai/blob/main/docs/configuration.md)
- Integrate Pythinker with local tools and automations: [OpenAI-Compatible API](https://github.com/mohamed-elkholy95/Pythinker-ai/blob/main/docs/openai-api.md) · [Python SDK](https://github.com/mohamed-elkholy95/Pythinker-ai/blob/main/docs/python-sdk.md)
- Run Pythinker with Docker or as a Linux service: [Deployment](https://github.com/mohamed-elkholy95/Pythinker-ai/blob/main/docs/deployment.md)
- Deeper dives: [Architecture](https://github.com/mohamed-elkholy95/Pythinker-ai/blob/main/docs/ARCHITECTURE.md) · [Memory](https://github.com/mohamed-elkholy95/Pythinker-ai/blob/main/docs/memory.md) · [Multiple Instances](https://github.com/mohamed-elkholy95/Pythinker-ai/blob/main/docs/multiple-instances.md) · [Channel Plugin Guide](https://github.com/mohamed-elkholy95/Pythinker-ai/blob/main/docs/channel-plugin-guide.md)

## 🤝 Contribute & Roadmap

PRs welcome! The codebase is intentionally small and readable. 🤗

### Branching Strategy

| Branch | Purpose |
|--------|---------|
| `main` | Stable releases — bug fixes and minor improvements |
| `dev` | Experimental features — new features and breaking changes |

**Unsure which branch to target?** See [CONTRIBUTING.md](https://github.com/mohamed-elkholy95/Pythinker-ai/blob/main/CONTRIBUTING.md) for details.

**Releases** — When publishing a new version, keep the README “What's new” callout and [CHANGELOG.md](https://github.com/mohamed-elkholy95/Pythinker-ai/blob/main/CHANGELOG.md) section in sync with the exact release version.

**Roadmap** — Pick an item and [open a PR](https://github.com/mohamed-elkholy95/Pythinker-ai/pulls)!

- **Multi-modal** — See and hear (images, voice, video)
- **Long-term memory** — Never forget important context
- **Better reasoning** — Multi-step planning and reflection
- **More integrations** — Calendar and more
- **Self-improvement** — Learn from feedback and mistakes

## 🔐 Security

Found a vulnerability? Please **do not open a public issue**. Follow the private disclosure process in [`SECURITY.md`](https://github.com/mohamed-elkholy95/Pythinker-ai/blob/main/SECURITY.md).

## 📄 License

Pythinker is released under the [MIT License](https://github.com/mohamed-elkholy95/Pythinker-ai/blob/main/LICENSE). Third-party components redistributed with the project are listed in [`THIRD_PARTY_NOTICES.md`](https://github.com/mohamed-elkholy95/Pythinker-ai/blob/main/THIRD_PARTY_NOTICES.md).

<p align="center">
  <em>Thanks for visiting ✨ Pythinker!</em>
</p>

<p align="center">
  <img src="https://visitor-badge.laobi.icu/badge?page_id=mohamed-elkholy95.Pythinker-ai" alt="Visitors">
</p>
