Local runtime host for long-running Deep Agents channels and schedules (experimental)
Project description
Deep Agents Talon
Deep Agents Talon is the local runtime host for long-running Deep Agents. It owns the process lifecycle for channel adapters, cron schedulers, and the agent runtime in a single event loop.
Experimental: Talon is an experimental runtime and is subject to change or removal at any time.
Talon currently includes:
- A host process with graceful shutdown, per-conversation serialization, and
/stopcancellation. - A generic channel protocol plus a WhatsApp adapter backed by a loopback Node bridge.
- A persistent cron scheduler with agent-facing cron tool helpers.
- MCP tool loading from the assistant manifest directory.
- Optional LangSmith tracing for each channel or cron-triggered run.
Quickstart
uv sync --group test
AGENT_ASSISTANT_ID=local AGENT_MODEL=openai:gpt-5.2 uv run deepagents-talon --once
If AGENT_MODEL is unset, Talon starts with the echo runtime. This is useful for checking host lifecycle and channel wiring without provider credentials.
Assistant state lives under ~/.deepagents/<assistant_id>/ by default. The host creates restrictive state directories for the materialized agent manifest, channel sessions, and cron jobs. The default local execution workspace is /workspace; set DEEPAGENTS_TALON_WORKSPACE to use a different directory.
Fleet Exports
Talon can host an operator-unzipped LangSmith Fleet export through the fleet-deepagents-export library:
unzip path/to/fleet-export.zip -d ./fleet
DEEPAGENTS_TALON_FLEET_DIR=./fleet \
AGENT_ASSISTANT_ID=fleet-local \
uv run deepagents-talon --once
In Fleet mode, Talon uses the model from fleet/config.json unless DEEPAGENTS_TALON_MODEL or AGENT_MODEL is set. The Fleet loader resolves MCP registry references through LangSmith, so provide the required LANGSMITH_API_KEY, LANGSMITH_TENANT_ID, LANGSMITH_ORGANIZATION_ID, and when needed LANGSMITH_USER_ID, BUILTIN_MCP_URL, LANGSMITH_HOST_URL, and HOST_LANGCHAIN_API_URL. Locally-authored agents without DEEPAGENTS_TALON_FLEET_DIR continue to load from the assistant manifest directory and Talon's plain MCP config discovery.
OAuth-backed Fleet MCP tools must be authorized once from an interactive shell before starting a headless host. Run the host in --once mode with the same Fleet directory and LangSmith environment you will use in production, complete the browser authorization if prompted, then start the long-running host:
DEEPAGENTS_TALON_FLEET_DIR=./fleet \
AGENT_ASSISTANT_ID=fleet-local \
uv run deepagents-talon --once
During a long-running Fleet session, Talon treats a 401/403 from an MCP tool as an expired OAuth credential signal. It reloads the Fleet components once, which re-mints tokens and rebuilds MCP connections, then retries the failed graph invocation once. If authorization still fails, Talon returns a structured mcp_auth_failed error instead of looping.
The WhatsApp channel uses a local Node bridge packaged with this library. The Python adapter talks to the bridge over loopback only.
cd deepagents_talon/channels/whatsapp_bridge
npm install
cd ../../..
DEEPAGENTS_TALON_WHATSAPP_ENABLED=true \
DEEPAGENTS_TALON_WHATSAPP_START_BRIDGE=true \
AGENT_ASSISTANT_ID=whatsapp-local \
AGENT_MODEL=openai:gpt-5.2 \
uv run deepagents-talon --whatsapp
The bridge prints a QR code during pairing. By default, inbound exposure is self, so only messages from the paired account trigger the agent. Configure DEEPAGENTS_TALON_WHATSAPP_EXPOSURE=allowlist with DEEPAGENTS_TALON_WHATSAPP_ALLOWLIST_CHATS or DEEPAGENTS_TALON_WHATSAPP_MENTION_PATTERNS to allow specific chats. Outbound WhatsApp messages include a deepagents bot header by default so self-message conversations clearly distinguish agent replies from operator messages. Set DEEPAGENTS_TALON_WHATSAPP_BOT_HEADER to customize that label. Markdown image/video references in assistant replies may attach files only when they are relative paths inside DEEPAGENTS_TALON_OUTBOUND_MEDIA_DIR, or inside DEEPAGENTS_TALON_WORKSPACE when no outbound media directory is configured.
Inbound voice transcription is opt-in:
DEEPAGENTS_TALON_VOICE_TRANSCRIPTION_ENABLED=true
When enabled without DEEPAGENTS_TALON_VOICE_TRANSCRIPTION_MODEL, Talon uses the same local default as the original WhatsApp example: nvidia/parakeet-tdt-0.6b-v3 through Transformers, with ffmpeg converting inbound audio to 16 kHz mono WAV first. Set DEEPAGENTS_TALON_VOICE_TRANSCRIPTION_DEVICE=cuda to use a GPU. The legacy example variables SPEECH_ENABLED and SPEECH_DEVICE are also accepted. Setting DEEPAGENTS_TALON_VOICE_TRANSCRIPTION_MODEL to a non-Parakeet model keeps the existing OpenAI SDK transcription path.
open exposure allows arbitrary WhatsApp senders to trigger the agent while it runs with the operator's model credentials, channel credentials, MCP tool access, and local-host access when the local execution backend is active. Enabling it requires explicit acknowledgement:
DEEPAGENTS_TALON_WHATSAPP_EXPOSURE=open
DEEPAGENTS_TALON_WHATSAPP_OPEN_ACK=allow-arbitrary-senders
See ../../examples/talon-whatsapp/ for a runnable Docker Compose topology and .env reference.
Tracing
LangSmith tracing is opt-in. Set both values before starting the host:
LANGSMITH_TRACING=true
LANGSMITH_API_KEY=...
LANGSMITH_PROJECT=deepagents-talon
When enabled, Talon wraps each agent run in a LangSmith tracing context with assistant id, conversation id, trigger metadata, and source message metadata.
MCP Tools
Talon loads MCP servers from one config file. It checks DEEPAGENTS_TALON_MCP_CONFIG, then MCP_CONFIG, then ~/.deepagents/<assistant_id>/agent/tools.json, then ~/.deepagents/.mcp.json. Add Talon-local servers by editing tools.json directly:
{
"mcpServers": {
"linear": {
"type": "http",
"url": "https://mcp.example/mcp"
}
}
}
Run deepagents-talon mcp config to print the resolved config paths, and deepagents-talon mcp login <server> for OAuth-backed servers.
Cron Observability
Cron jobs are persisted in cron/jobs.json under the assistant state directory. Scheduler lifecycle events are emitted through the standard Python logger as talon_event JSON records:
cron.tickcron.dispatchcron.successcron.failurecron.deliverycron.delivery_suppressedcron.delivery_failure
These logs complement the persisted last_status and last_error fields.
Security and Data Lifecycle
Talon is single-operator by design. It does not provide multi-tenant isolation, and channel exposure should be treated as direct access to the operator's agent.
Attacker-influenceable inputs include channel message text, voice transcripts, channel media metadata, downloaded media files when a channel adapter persists them for processing, web or search result content, MCP tool results, and imported manifest instructions. Treat all of those inputs as untrusted content entering the agent context.
Outbound data leaves Talon through these integrations:
- Model providers receive conversation text, cron prompts, voice transcripts, selected tool outputs, and system or manifest instructions.
- LangSmith receives trace metadata and serialized run inputs/outputs when
LANGSMITH_TRACING=true. - MCP servers receive tool arguments chosen by the model and may receive conversation-derived values.
- Tavily or other search tools receive query strings chosen by the model and may include conversation-derived values.
- Channel providers receive assistant replies and outbound media paths supplied to the channel adapter.
Sensitive local state is stored under ~/.deepagents/<assistant_id>/ by default with 0700 directories and 0600 cron files:
cron/jobs.jsonstores cron prompts, origin conversation ids, message ids, run status, and errors. Active jobs are retained while enabled. Completed jobs are deleted on startup afterDEEPAGENTS_TALON_CRON_RETENTION_DAYS, default30.channels/whatsapp/stores WhatsAppLocalAuthcredentials and Chromium profile state. These credentials are retained until the operator deletes the directory, because automatic deletion would silently unpair the channel.media/inbound/is reserved for downloaded inbound media. Files older thanDEEPAGENTS_TALON_INBOUND_MEDIA_RETENTION_HOURS, default24, are deleted on startup. The WhatsApp bridge stores downloaded inbound media under the assistant's inbound media directory and passes local paths plus MIME metadata to the host.
Conversation persistence is intentionally not durable yet. Runtime conversation state is in-memory unless a future backend explicitly adds thread persistence.
Development
uv sync --group test
uv run --group test pytest tests/
uv run deepagents-talon
Focused verification:
make lint
make test
Project details
Release history Release notifications | RSS feed
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 deepagents_talon-0.0.1.tar.gz.
File metadata
- Download URL: deepagents_talon-0.0.1.tar.gz
- Upload date:
- Size: 370.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7255ebfff71c2afeabc45ee47966cfde2a7fb3970a0f589f30fd851ff695cbe8
|
|
| MD5 |
657063659f92f96d11884ae37eaae23c
|
|
| BLAKE2b-256 |
36f32c5f742327023c60d1ec1eb9371ff309dddf47aceb580ba521a729325f51
|
File details
Details for the file deepagents_talon-0.0.1-py3-none-any.whl.
File metadata
- Download URL: deepagents_talon-0.0.1-py3-none-any.whl
- Upload date:
- Size: 90.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
38af40a6a5b5a6d89142f92ef8dd5b449e1ed1ccd865719c4f2cc030f9fa72f0
|
|
| MD5 |
ff1cd889ca7c0f6fa1736fd4463e7f83
|
|
| BLAKE2b-256 |
3cee9d15b4bbdac0f20a57c730353da0b80ea298313e1a19028f875768b4ae01
|