Skip to main content

Chat platform bridges for AI agent supervision

Project description

agent-tether

Connect AI coding agents to human oversight through Telegram, Slack, and Discord.

A Python library that provides chat platform bridges for supervising AI agents. Each bridge handles platform-specific formatting, thread management, approval flows with inline buttons, auto-approve timers, and command handling.

Use Cases:

  • Monitor Claude Code or Codex sessions from your phone while agents run locally
  • Get approval requests as Telegram notifications with one-tap approve/deny
  • Set auto-approve timers (per-session, per-tool, per-directory)
  • Send additional input or stop agents remotely

Looking for a ready-made solution for connecting your agents? Check out Tether.

Install

pip install agent-tether[telegram]   # Telegram support
pip install agent-tether[slack]      # Slack support (experimental)
pip install agent-tether[discord]    # Discord support
pip install agent-tether[all]        # All platforms

Architecture

Your Application
    │
    ├── BridgeCallbacks       → You implement these to wire up your backend
    │
    ├── agent-tether bridges
    │     ├── TelegramBridge  → Telegram forum topics
    │     ├── SlackBridge     → Slack threads (experimental)
    │     └── DiscordBridge   → Discord threads
    │
    ├── BridgeManager         → Routes events to the right bridge
    └── BridgeSubscriber      → Consumes store events, forwards to bridges

Core Components

  • BridgeCallbacks: Dataclass of async callbacks that you provide, connecting bridges to your session backend
  • BridgeInterface: Abstract base class with shared logic for auto-approve, approval parsing, error debouncing, and formatting
  • BridgeManager: Routes output, approvals, and status changes to the correct platform bridge
  • BridgeSubscriber: Consumes events from a store subscriber queue and forwards them to bridges
  • BridgeConfig: Configuration (data directory, default adapter, error debounce)

Quick Start

from agent_tether import (
    BridgeCallbacks,
    BridgeConfig,
    BridgeManager,
    TelegramBridge,
)

# Implement callbacks to wire bridges to your backend
callbacks = BridgeCallbacks(
    create_session=my_create_session,
    send_input=my_send_input,
    stop_session=my_stop_session,
    respond_to_permission=my_respond_to_permission,
    list_sessions=my_list_sessions,
    get_usage=my_get_usage,
    check_directory=my_check_directory,
    list_external_sessions=my_list_external,
    get_external_history=my_get_history,
    attach_external=my_attach_external,
)

# Configure
config = BridgeConfig(data_dir="/tmp/agent-tether")

# Create a Telegram bridge
telegram = TelegramBridge(
    bot_token="BOT_TOKEN",
    forum_group_id=123456,
    config=config,
    callbacks=callbacks,
    get_session_directory=lambda sid: "/home/user/project",
)

# Register with manager
manager = BridgeManager()
manager.register_bridge("telegram", telegram)

# Route events from your backend
await manager.route_output("sess_1", "Starting work...", "telegram")
await manager.route_status("sess_1", "running", "telegram")

BridgeCallbacks

The BridgeCallbacks dataclass defines 10 async functions that connect agent-tether to your session backend:

Callback Signature Purpose
create_session (**kwargs) -> dict Create a new agent session
send_input (session_id, text) -> None Send human input to a session
stop_session (session_id) -> None Interrupt/stop a running session
respond_to_permission (session_id, request_id, allow, message?) -> bool Approve or deny a permission request
list_sessions () -> list[dict] List all active sessions
get_usage (session_id) -> dict Get token/cost usage for a session
check_directory (path) -> dict Validate a directory path
list_external_sessions (**kwargs) -> list[dict] Discover running external sessions
get_external_history (external_id, runner_type, limit) -> dict? Fetch history for an external session
attach_external (**kwargs) -> dict Attach to an external session

All callbacks default to no-ops, so you only need to implement the ones your application uses.

Approval Parsing

Bridges parse human text into approval responses:

from agent_tether import BridgeInterface

# These are parsed by bridges when users reply in chat
bridge.parse_approval_text("allow")       # → {"allow": True, "timer": None}
bridge.parse_approval_text("deny: risky") # → {"allow": False, "reason": "risky"}
bridge.parse_approval_text("allow all")   # → {"allow": True, "timer": "all"}
bridge.parse_approval_text("allow Bash")  # → {"allow": True, "timer": "Bash"}

Auto-Approve Timers

# Auto-approve all tools for this session (30 min)
bridge.set_allow_all("sess_1")

# Auto-approve only Bash for this session (30 min)
bridge.set_allow_tool("sess_1", "Bash")

# Auto-approve all sessions in a directory (30 min)
bridge.set_allow_directory("/home/user/project")

# Check if a request should be auto-approved
reason = bridge.check_auto_approve("sess_1", "Bash")
# Returns "Allow All", "Allow Bash", "Allow dir project", or None

Features

Chat Platform Bridges

  • Telegram: Forum topics, inline keyboard approval buttons, typing indicators, HTML formatting
  • Slack (experimental): Socket mode, threaded conversations, text-based approval commands
  • Discord: Channel threads, pairing/authorization system, text-based approvals

Shared Bridge Logic

  • Auto-approve engine: Per-session, per-tool, and per-directory timers (30 min default)
  • Approval parsing: Text commands (allow/deny/proceed/cancel) with tool and directory timers
  • Choice parsing: Numeric or label-based selection for multi-option prompts
  • Error debouncing: Suppress rapid-fire error notifications
  • Notification batching: Collapse rapid auto-approvals into single messages
  • External session pagination: Browse and attach to running Claude Code/Codex sessions
  • Formatting: Tool input JSON to readable markdown, message chunking

Commands (available in all bridges)

  • /help or !help: Show available commands
  • /status or !status: List all sessions
  • /list or !list: List external sessions (Claude Code, Codex)
  • /attach or !attach: Attach to an external session
  • /new or !new: Start a new session
  • /stop or !stop: Interrupt the current session
  • /usage or !usage: Show token usage and cost

Documentation

Contributing

Contributions welcome! Please feel free to submit a Pull Request.

License

MIT. See LICENSE for details.

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

agent_tether-0.4.0.tar.gz (59.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

agent_tether-0.4.0-py3-none-any.whl (53.3 kB view details)

Uploaded Python 3

File details

Details for the file agent_tether-0.4.0.tar.gz.

File metadata

  • Download URL: agent_tether-0.4.0.tar.gz
  • Upload date:
  • Size: 59.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for agent_tether-0.4.0.tar.gz
Algorithm Hash digest
SHA256 ad96785b9a96fb54efd0083431a33dacb4632b06358ad13613d97385fcf354b5
MD5 498ea91800382b4cd030c13911cc545c
BLAKE2b-256 6dddf24befd1f3770886c42fc309b737903a18d9baa6d54b42142fd091f5d14d

See more details on using hashes here.

Provenance

The following attestation bundles were made for agent_tether-0.4.0.tar.gz:

Publisher: publish.yml on larsderidder/agent-tether

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file agent_tether-0.4.0-py3-none-any.whl.

File metadata

  • Download URL: agent_tether-0.4.0-py3-none-any.whl
  • Upload date:
  • Size: 53.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for agent_tether-0.4.0-py3-none-any.whl
Algorithm Hash digest
SHA256 040862d8c22267b46bc7c10ef85b5fdbe53193cc4fafa676d184a250b63ca965
MD5 a5c1c60bb7378b45d15e7a541d424cb6
BLAKE2b-256 8902786ebc0b9cfc5ecf03837a45f30bd4d3e4bcd806cd7834a3defb5423e4a6

See more details on using hashes here.

Provenance

The following attestation bundles were made for agent_tether-0.4.0-py3-none-any.whl:

Publisher: publish.yml on larsderidder/agent-tether

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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