Integrations
Every provider threads ships an adapter for, what to import it from, and where it is documented.
Each integration is a factory function that returns an adapter: a model, a sandbox, a channel, a memory provider, a search backend, a store or an exporter. You pass it to an agent or a host; the framework never talks to a provider any other way.
Adapters live in their own package (TypeScript) or behind their own extra (Python), so the core
depends on nothing but zod and pydantic. Installation lists the packages
and extras. Which of these each language has today is in
Python and TypeScript.
Models
| TypeScript | Python | Guide | |
|---|---|---|---|
| Anthropic | anthropic() from @threads/anthropic | anthropic() from threads.anthropic | Models |
| OpenAI | openai() from @threads/openai | openai() from threads.openai | Models |
| Everything else | aiSdk() from @threads/ai-sdk, for any AI SDK provider | litellm() from threads.litellm, over LiteLLM's OpenAI-compatible route | Models |
| Scripted model, for tests | scriptedModel() from @threads/core | scripted_model() from threads | Testing |
Sandboxes
| TypeScript | Python | Guide | |
|---|---|---|---|
| E2B | e2b() from @threads/e2b | e2b() from threads.e2b | E2B |
| Daytona | daytona() from @threads/daytona | daytona() from threads.daytona | Daytona |
| Modal | — | modal() from threads.modal | Modal |
| Fake sandbox, for tests | fakeSandbox() from @threads/core | fake_sandbox() from threads | Testing |
Modal is Python only for now: modal() from @threads/modal throws ConfigError
transport_fence_unsupported, because Modal's JavaScript SDK sends commands over a connection
threads can't safely wrap.
Credentials stay on the host. A sandbox never receives a key, and has no internet unless you give it one. See Sandboxes.
Channels
| TypeScript | Python | Guide | |
|---|---|---|---|
| Slack | slack() from @threads/slack | slack() from threads.slack | Slack |
whatsapp() from @threads/whatsapp | whatsapp() from threads.whatsapp | ||
| GitHub | github() from @threads/github | github() from threads.github | GitHub |
Channels run under the host, which also serves the HTTP API and cron schedules.
Tools from other servers
| TypeScript | Python | Guide | |
|---|---|---|---|
| Any MCP server | mcp() from @threads/mcp | mcp() from threads.mcp | MCP servers |
Web search
The web_search tool needs a backend. All three come from the core package.
| TypeScript | Python | Guide | |
|---|---|---|---|
| Exa | exa() from @threads/core | exa() from threads.search | Built-in tools |
| Tavily | tavily() from @threads/core | tavily() from threads.search | Built-in tools |
| Brave | brave() from @threads/core | brave() from threads.search | Built-in tools |
Memory and knowledge
| TypeScript | Python | Guide | |
|---|---|---|---|
| Local memory | localMemory() from @threads/core | local_memory() from threads | Memory |
| Supermemory | supermemory() from @threads/supermemory | supermemory() from threads.supermemory | Memory |
| Zep | zep() from @threads/zep | zep() from threads.zep | Memory |
| Local knowledge base | localKnowledge() from @threads/core | local_knowledge() from threads | Knowledge |
There is a mem0() factory, but it refuses: the mem0ai SDK sends requests outside any transport
threads can fence, so a call could not be recorded or replayed. Use supermemory() or zep().
See mem0.
Stores
The store is where the event log lives. Everything else is built on it.
| TypeScript | Python | Guide | |
|---|---|---|---|
| SQLite | sqlite() from @threads/core | sqlite() from threads | Durability |
| Postgres | postgres() from @threads/postgres | postgres() from threads.postgres | Deploying |
Telemetry
| TypeScript | Python | Guide | |
|---|---|---|---|
| OpenTelemetry (OTLP) | otel() from @threads/otel | otel() from threads.otel | Observability |
Writing your own
Every one of these is an ordinary implementation of a public protocol — Model, Sandbox,
ChannelAdapter, MemoryProvider, KnowledgeProvider, SearchBackend, Store, Exporter —
documented in the API reference. Nothing above uses a private hook, so a
provider we don't ship is an adapter you can write yourself.