Skip to main content

Built-in Plugins

Thoth ships a small set of plugins bundled with the repository. They live under <repo>/plugins/<name>/ and load automatically alongside user-installed plugins in ~/.thoth/plugins/. They use the same plugin surface as third-party plugins — hooks, tools, slash commands — just maintained in-tree.

See the Plugins page for the general plugin system, and Build a Thoth Plugin to write your own.

How discovery works

The PluginManager scans four sources, in order:

  1. Bundled<repo>/plugins/<name>/ (what this page documents)
  2. User~/.thoth/plugins/<name>/
  3. Project./.thoth/plugins/<name>/ (requires THOTH_ENABLE_PROJECT_PLUGINS=1)
  4. Pip entry pointsthoth_agent.plugins

On name collision, later sources win — a user plugin named disk-cleanup would replace the bundled one.

plugins/memory/ and plugins/context_engine/ are deliberately excluded from bundled scanning. Those directories use their own discovery paths because memory providers and context engines are single-select providers configured through thoth memory setup / context.engine in config.

Bundled plugins are opt-in

Bundled plugins ship disabled. Discovery finds them (they appear in thoth plugins list and the interactive thoth plugins UI), but none load until you explicitly enable them:

thoth plugins enable disk-cleanup

Or via ~/.thoth/config.yaml:

plugins:
enabled:
- disk-cleanup

This is the same mechanism user-installed plugins use. Bundled plugins are never auto-enabled — not on fresh install, not for existing users upgrading to a newer Thoth. You always opt in explicitly.

To turn a bundled plugin off again:

thoth plugins disable disk-cleanup
# or: remove it from plugins.enabled in config.yaml

Currently shipped

The repo ships these bundled plugins under plugins/. All are opt-in — enable them via thoth plugins enable <name>.

PluginKindPurpose
disk-cleanuphooks + slash commandAuto-track ephemeral files and clean them on session end
observability/langfusehooksTrace turns / LLM calls / tools to Langfuse
spotifybackend (7 tools)Native Spotify playback, queue, search, playlists, albums, library
google_meetstandaloneJoin Meet calls, live-caption transcription, optional realtime duplex audio
image_gen/openaiimage backendOpenAI gpt-image-2 image generation backend (alternative to FAL)
image_gen/openai-codeximage backendOpenAI image generation via Codex OAuth
image_gen/xaiimage backendxAI grok-2-image backend
kanban/dashboarddashboard tabKanban board UI for the multi-agent dispatcher — tasks, comments, fan-out, board switching. See Kanban Multi-Agent.

Memory providers (plugins/memory/*) and context engines (plugins/context_engine/*) are listed separately on Memory Providers — they're managed through thoth memory and thoth plugins respectively. The full per-plugin detail for the two long-running hooks-based plugins follows.

disk-cleanup

Auto-tracks and removes ephemeral files created during sessions — test scripts, temp outputs, cron logs, stale chrome profiles — without requiring the agent to remember to call a tool.

How it works:

HookBehaviour
post_tool_callWhen write_file / terminal / patch creates a file matching test_*, tmp_*, or *.test.* inside THOTH_HOME or /tmp/thoth-*, track it silently as test / temp / cron-output.
on_session_endIf any test files were auto-tracked during the turn, run the safe quick cleanup and log a one-line summary. Stays silent otherwise.

Deletion rules:

CategoryThresholdConfirmation
testevery session endNever
temp>7 days since trackedNever
cron-output>14 days since trackedNever
empty dirs under THOTH_HOMEalwaysNever
research>30 days, beyond 10 newestAlways (deep only)
chrome-profile>14 days since trackedAlways (deep only)
files >500 MBnever autoAlways (deep only)

Slash command/disk-cleanup available in both CLI and gateway sessions:

/disk-cleanup status # breakdown + top-10 largest
/disk-cleanup dry-run # preview without deleting
/disk-cleanup quick # run safe cleanup now
/disk-cleanup deep # quick + list items needing confirmation
/disk-cleanup track <path> <category> # manual tracking
/disk-cleanup forget <path> # stop tracking (does not delete)

State — everything lives at $THOTH_HOME/disk-cleanup/:

FileContents
tracked.jsonTracked paths with category, size, and timestamp
tracked.json.bakAtomic-write backup of the above
cleanup.logAppend-only audit trail of every track / skip / reject / delete

Safety — cleanup only ever touches paths under THOTH_HOME or /tmp/thoth-*. Windows mounts (/mnt/c/...) are rejected. Well-known top-level state dirs (logs/, memories/, sessions/, cron/, cache/, skills/, plugins/, disk-cleanup/ itself) are never removed even when empty — a fresh install does not get gutted on first session end.

Enabling: thoth plugins enable disk-cleanup (or check the box in thoth plugins).

Disabling again: thoth plugins disable disk-cleanup.

observability/langfuse

Traces Thoth turns, LLM calls, and tool invocations to Langfuse — an open-source LLM observability platform. One span per turn, one generation per API call, one tool observation per tool call. Usage totals, per-type token counts, and cost estimates come out of Thoth's canonical agent.usage_pricing numbers, so the Langfuse dashboard sees the same breakdown (input / output / cache_read_input_tokens / cache_creation_input_tokens / reasoning_tokens) that appears in thoth logs.

The plugin is fail-open: no SDK installed, no credentials, or a transient Langfuse error — all turn into a silent no-op in the hook. The agent loop is never impacted.

Setup:

pip install langfuse
thoth plugins enable observability/langfuse

Or check the box in the interactive thoth plugins UI. Then put the credentials in ~/.thoth/.env:

THOTH_LANGFUSE_PUBLIC_KEY=pk-lf-...
THOTH_LANGFUSE_SECRET_KEY=sk-lf-...
THOTH_LANGFUSE_BASE_URL=https://cloud.langfuse.com # or your self-hosted URL

How it works:

HookBehaviour
pre_api_request / pre_llm_callOpen (or reuse) a per-turn root span "Thoth turn". Start a generation child observation for this API call with serialized recent messages as input.
post_api_request / post_llm_callClose the generation, attach usage_details, cost_details, finish_reason, assistant output + tool calls. If no tool calls and non-empty content, close the turn.
pre_tool_callStart a tool child observation with sanitized args.
post_tool_callClose the tool observation with sanitized result. read_file payloads get summarized (head + tail + omitted-line count) so a huge file read stays under THOTH_LANGFUSE_MAX_CHARS.

Session grouping keys off the Thoth session ID (or task ID for sub-agents) via langfuse.propagate_attributes, so everything in a single thoth chat session lives under one Langfuse session.

Verify:

thoth plugins list # observability/langfuse should show "enabled"
thoth chat -q "hello" # check the Langfuse UI for a "Thoth turn" trace

Optional tuning (in .env):

VariableDefaultPurpose
THOTH_LANGFUSE_ENVEnvironment tag on traces (production, staging, …)
THOTH_LANGFUSE_RELEASERelease/version tag
THOTH_LANGFUSE_SAMPLE_RATE1.0Sampling rate passed to the SDK (0.0–1.0)
THOTH_LANGFUSE_MAX_CHARS12000Per-field truncation for message content / tool args / tool results
THOTH_LANGFUSE_DEBUGfalseVerbose plugin logging to agent.log

Thoth-prefixed and standard SDK env vars (LANGFUSE_PUBLIC_KEY, LANGFUSE_SECRET_KEY, LANGFUSE_BASE_URL) are both accepted — Thoth-prefixed wins when both are set.

Performance: the Langfuse client is cached after the first hook call. If credentials or SDK are missing, that decision is also cached — subsequent hooks fast-return without re-checking env vars or reloading config.

Disabling: thoth plugins disable observability/langfuse. The plugin module is still discovered, but no module code runs until you re-enable.

google_meet

Lets the agent join, transcribe, and participate in Google Meet calls — take notes on a meeting, summarize the back-and-forth after, follow up on specific points, and (optionally) speak replies back into the call via TTS.

What it adds:

  • A headless virtual participant that joins a Meet URL using browser automation
  • Live transcription of the meeting audio via the configured STT provider
  • A meet_summarize / meet_speak / meet_followup toolset the agent invokes to act on what it heard
  • Post-meeting artifacts (transcript, speaker-attributed notes, action items) saved under ~/.thoth/cache/google_meet/<meeting_id>/

Setup:

thoth plugins enable google_meet
# Prompts you to sign in via the plugin's OAuth flow on first use —
# needs a Google account with Meet access. Host approval may be required
# if the meeting enforces "only invited participants can join".

Usage from chat:

"Join meet.google.com/abc-defg-hij and take notes. After the call, send me a summary with action items."

The agent kicks off the meeting join, streams the transcription back into its context as the call proceeds, and produces a structured summary when the meeting ends (or when you tell it to stop).

When to use it: recurring standups where you want a bot to transcribe + summarize for async attendees; deposition-style interviews where you want structured notes; any case where you'd otherwise need Fireflies / Otter / Grain. When you'd rather not have an AI listening in — don't enable it.

Disabling: thoth plugins disable google_meet. Any cached transcripts and recordings stay in ~/.thoth/cache/google_meet/ until you remove them.

Adding a bundled plugin

Bundled plugins are written exactly like any other Thoth plugin — see Build a Thoth Plugin. The only differences are:

  • Directory lives at <repo>/plugins/<name>/ instead of ~/.thoth/plugins/<name>/
  • Manifest source is reported as bundled in thoth plugins list
  • User plugins with the same name override the bundled version

A plugin is a good candidate for bundling when:

  • It has no optional dependencies (or they're already pip install .[all] deps)
  • The behaviour benefits most users and is opt-out rather than opt-in
  • The logic ties into lifecycle hooks that the agent would otherwise have to remember to invoke
  • It complements a core capability without expanding the model-visible tool surface

Counter-examples — things that should stay as user-installable plugins, not bundled: third-party integrations with API keys, niche workflows, large dependency trees, anything that would meaningfully change agent behaviour by default.