Files
simplex-chat/packages/simplex-chat-python
Alain BrenzikoferandClaude Opus 5 52afb09711 names: fix API docs lists, route signing through signSnrcIntent
The 12 new /name commands and 8 responses were in none of the docs
  lists, and APINameAddress/CRNameAddress outlived their constructors.
  Added alongside APINameRegister, which set the precedent. Also
  regenerates TYPES.md and the TS/Python types, stale since
  CENameRegistrationFailed gained nameRegRetryAfter.

  APINameSetLink now signs through signSnrcIntent, so "the only bridge
  to the wallet" is enforced rather than documented. tokenId is dropped
  and setTextTypeString unexported, both without callers.

  nameKeyOf no longer reads the bound account: the path is literal, so
  the binding never affected which key came back. The mock's idempotent
  is one transaction, and a buy with no link stores no link rather than
  an empty one.

  ownedNames stays device-wide, now with the reason on it.

  Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-30 21:39:24 +02:00
..

SimpleX Chat Python library

Python 3.11+ client for SimpleX Chat bots. Equivalent to the Node.js library.

Install

pip install simplex-chat

The native libsimplex is downloaded lazily on first use. To pre-fetch:

python -m simplex_chat install                     # sqlite (default)
python -m simplex_chat install --backend postgres  # linux-x86_64 only

Quick start

import re
from simplex_chat import Bot, BotProfile, Message, SqliteDb, TextMessage

bot = Bot(
    profile=BotProfile(display_name="Squaring bot"),
    db=SqliteDb(file_prefix="./squaring_bot"),
    welcome="Send me a number, I'll square it.",
)

@bot.on_message(content_type="text", text=re.compile(r"^-?\d+(\.\d+)?$"))
async def square(msg: TextMessage) -> None:
    n = float(msg.text or "0")
    await msg.reply(f"{n} * {n} = {n * n}")

@bot.on_message(content_type="text")
async def fallback(msg: Message) -> None:
    await msg.reply("Send me a number, like 7 or 3.14.")

if __name__ == "__main__":
    bot.run()

bot.run() blocks. The connection address is logged on startup — paste it into a SimpleX client to talk to the bot. Ctrl+C to stop.

Three decorators: @bot.on_message(...), @bot.on_command(name), @bot.on_event(tag). Message handlers are first-match-wins in registration order, so register specific filters first and catch-alls last.

See examples/squaring_bot.py for the full example.

Development

uv venv && source .venv/bin/activate
uv pip install -e '.[dev]'
ruff check && pyright && pytest tests/

Wire types under src/simplex_chat/types/_*.py are generated. Regenerate with cabal test simplex-chat-test --test-options='--match Python'.

Release

Manual for now. Bump _version.py:__version__, build a wheel, upload to PyPI:

uv build --wheel
uv publish --token "$PYPI_TOKEN"

License

AGPL-3.0