---
description: >-
  Choose a Watcher connection for coding agents, frameworks, gateways, compliance data and observability tools.
---

> Part of the Watcher docs. Index of all pages, with summaries: https://watcher-docs.apolloresearch.ai/llms.txt
> Before upgrading Watcher, read the release pages and full changelogs for every version crossed: https://watcher-docs.apolloresearch.ai/releases/index.md
> Found an issue with this page? Report it: https://github.com/ApolloResearch/watcher-bin/issues/new?title=Docs%20feedback%3A%20Integrations&body=Page%3A%20Integrations%0AURL%3A%20https%3A%2F%2Fwatcher-docs.apolloresearch.ai%2Fintegrations%2F%0A%0A

# Integrations

Use the [Watcher client](../client/index.md) for its built-in agent connections.
Use [gateway hooks](../api/hooks.md) or the [Python SDK](../api/python-sdk.md) to
connect other tools. SDK examples show how to make those connections and state
the limits of each one.

## Built-in connections

| Connection | Recording | Tool blocking | Setup |
| --- | --- | --- | --- |
| Local Claude Code | The client records [sessions](../concepts/sessions-and-trajectories.md) through agent hooks. | [Blocking review](../concepts/blocking-and-trailing-review.md) runs before covered tool calls. | [Supported agents](../supported-agents.md) |
| Local Codex | The client records sessions through agent hooks. | Watcher reviews requests that Codex routes through its approval flow. | [Supported agents](../supported-agents.md) |

[Blocking review](../concepts/blocking-and-trailing-review.md) depends on the
agent's execution path and settings. Watcher cannot block tools in a Codex run
that requests no approvals. Recording alone does not mean a tool was checked
before it ran.

Claude Tag monitoring is unsupported. See [Supported agents](../supported-agents.md#claude-tag) for its limits.

## SDK examples

The examples are source code to adapt and test in your own environment. **Example**
in the support column is distinct from a built-in client connection.

Download `watcher_sdk-<version>-source.tar.gz` from the
[Watcher release matching your server](https://github.com/ApolloResearch/watcher-bin/releases).
Extract it with `tar -xzf watcher_sdk-<version>-source.tar.gz`, replacing
`<version>` with the release number without its leading `v`. The examples are
under `sdk/examples/`. Keep the whole `sdk/` directory together: Python examples
install the SDK from the adjacent source. The wheel installs the client library and optional CLI; adapters ship in the
source archive. Older source releases may not contain examples.

The integration links below lead to upstream projects or their documentation.
Source folders refer to paths within `sdk/examples/`; each folder's README gives
setup, usage, supported inputs, error behavior and test commands.

### Set up Copilot

Follow the [Copilot quickstart](copilot.md) to install recording and
[blocking review](../concepts/blocking-and-trailing-review.md) for every Copilot
session of your user with one command. The installer provides Python, uv and
the adapter. It signs in with your login, through the browser or a saved login,
and does not accept API keys. The local Watcher app and a source checkout are
optional.

The install is Blocking review by default, or Record only with
`--record-only`. Your administrator's enforce, observe or paused
[enforcement mode](../concepts/blocking-and-trailing-review.md#enforcement-modes)
decides what Blocking review does. In enforce mode, a Watcher approval skips
Copilot's own permission prompt and overrides your Copilot deny rules. These
personal hooks are per user and removable; only managed policy hooks, which an
administrator deploys as root, for example through MDM, are enforced by Copilot.
Add `--project` to install in one project instead. When both installs cover a
project, both run, and install and status warn about it. Opt a project out with
`watcher-sdk integrations opt-out copilot --project PATH`. Status reports
confirmed transcript delivery separately from the read-back of stored
judgments.

Copilot appears as **GitHub Copilot CLI** in session views and new alerts.
Other recognized SDK agents also appear by name. Agent filters use those names,
including for older sessions with retained adapter IDs. A name does not imply
support for every feature; the coverage and limits below still apply.

### Verification labels

The mode columns summarize recorded tests. Dates identify those runs; they do not
establish compatibility with changes made since the test. Read the example's
README for the tested environment, covered paths and limits.

| Label | Meaning |
| --- | --- |
| Static Tests | Adapter tests with simulated Watcher responses; some also exercise installed upstream software. |
| End-to-end testing | The integration path was tested against the Watcher API and database, locally or deployed. Model output or hosted services may use fixtures; see the example's README. |
| Not available | The example does not provide this feature. |

These labels describe test coverage, not a guarantee about all tools or sessions.
Read the example's limits before using it for blocking review. Some hooks can
refuse a tool without recording a decision. Others may let tools run when a hook
does not start, times out, or is not loaded.

Local exporter tests do not establish that a hosted destination indexed the records
or generated an alert. Each example README names the tested
receiver and the steps needed to verify your destination.

<!-- BEGIN INTEGRATIONS -->

### Coding agents

| Integration | Source folder | Observe | Block tools | Last tested | Support |
| --- | --- | --- | --- | --- | --- |
| [Aider](https://github.com/Aider-AI/aider) | `aider/` | End-to-end testing | End-to-end testing | 2026-09-26 | Example |
| [Amp](https://ampcode.com/docs/markdown/sdk/python) | `amp/` | Static Tests | Not available | 2026-09-26 | Example |
| [Cline](https://github.com/cline/cline) | `cline/` | End-to-end testing | End-to-end testing | 2026-09-26 | Example |
| [Continue CLI](https://github.com/continuedev/continue) | `continue/` | Static Tests | Not available | 2026-09-26 | Example |
| [Cursor](https://cursor.com/docs/agent/hooks) | `cursor/` | Static Tests | Static Tests | 2026-09-26 | Example |
| [Gemini CLI](https://github.com/google-gemini/gemini-cli) | `gemini-cli/` | End-to-end testing | End-to-end testing | 2026-09-26 | Example |
| [GitHub Copilot CLI](https://github.com/github/copilot-cli) | `github-copilot-cli/` | Static Tests | Static Tests | 2026-10-02 | Example |
| [Goose](https://github.com/aaif-goose/goose) | `goose/` | End-to-end testing | End-to-end testing | 2026-09-26 | Example |
| [Kilo Code](https://github.com/Kilo-Org/kilocode) | `kilocode/` | End-to-end testing | End-to-end testing | 2026-09-26 | Example |
| [Mistral Vibe](https://github.com/mistralai/mistral-vibe) | `mistral-vibe/` | End-to-end testing | End-to-end testing | 2026-09-26 | Example |
| [OpenCode](https://github.com/anomalyco/opencode) | `opencode/` | End-to-end testing | End-to-end testing | 2026-09-26 | Example |
| [OpenHands](https://github.com/OpenHands/software-agent-sdk) | `openhands/` | End-to-end testing | End-to-end testing | 2026-09-26 | Example |
| [Pi](https://github.com/badlogic/pi-mono) | `pi/` | End-to-end testing | End-to-end testing | 2026-09-26 | Example |
| [Qwen Code](https://github.com/QwenLM/qwen-code) | `qwen-code/` | End-to-end testing | End-to-end testing | 2026-09-26 | Example |
| [Roo Code](https://github.com/RooCodeInc/Roo-Code) | `roo-code/` | Static Tests | Not available | 2026-09-26 | Example |
| [Windsurf](https://docs.windsurf.com/windsurf/cascade/hooks) | `windsurf/` | Static Tests | Static Tests | 2026-09-26 | Example |

### General-purpose agents

| Integration | Source folder | Observe | Block tools | Last tested | Support |
| --- | --- | --- | --- | --- | --- |
| [OpenClaw](https://github.com/openclaw/openclaw) | `openclaw/` | End-to-end testing | End-to-end testing | 2026-09-26 | Example |

### Agent frameworks

| Integration | Source folder | Observe | Block tools | Last tested | Support |
| --- | --- | --- | --- | --- | --- |
| [Agno](https://github.com/agno-agi/agno) | `agno/` | Static Tests | Static Tests | 2026-09-26 | Example |
| [AutoGen](https://github.com/microsoft/autogen) | `autogen/` | Static Tests | Static Tests | 2026-09-26 | Example |
| [CAMEL](https://github.com/camel-ai/camel) | `camel/` | Static Tests | Static Tests | 2026-09-26 | Example |
| [CrewAI](https://github.com/crewAIInc/crewAI) | `crewai/` | Static Tests | Static Tests | 2026-09-26 | Example |
| [DSPy](https://github.com/stanfordnlp/dspy) | `dspy/` | Static Tests | Static Tests | 2026-09-26 | Example |
| [Google ADK](https://github.com/google/adk-python) | `google-adk/` | Static Tests | Static Tests | 2026-09-26 | Example |
| [Haystack](https://github.com/deepset-ai/haystack) | `haystack/` | Static Tests | Static Tests | 2026-09-26 | Example |
| [LangChain](https://github.com/langchain-ai/langchain) | `langchain/` | Static Tests | Static Tests | 2026-09-26 | Example |
| [LangChain4j](https://github.com/langchain4j/langchain4j/tree/1.20.0) | `langchain4j/` | End-to-end testing | End-to-end testing | 2026-09-26 | Example |
| [LangGraph](https://github.com/langchain-ai/langgraph) | `langgraph/` | Static Tests | Static Tests | 2026-09-26 | Example |
| [LlamaIndex](https://github.com/run-llama/llama_index) | `llamaindex/` | Static Tests | Static Tests | 2026-09-26 | Example |
| [Mastra](https://github.com/mastra-ai/mastra) | `mastra/` | End-to-end testing | End-to-end testing | 2026-09-26 | Example |
| [OpenAI Agents](https://github.com/openai/openai-agents-python) | `openai-agents/` | Static Tests | Static Tests | 2026-09-26 | Example |
| [Pydantic AI](https://github.com/pydantic/pydantic-ai) | `pydantic-ai/` | Static Tests | Static Tests | 2026-09-26 | Example |
| [Semantic Kernel](https://github.com/microsoft/semantic-kernel) | `semantic-kernel/` | Static Tests | Static Tests | 2026-09-26 | Example |
| [smolagents](https://github.com/huggingface/smolagents) | `smolagents/` | Static Tests | Static Tests | 2026-09-26 | Example |
| [Strands Agents](https://github.com/strands-agents/harness-sdk) | `strands/` | Static Tests | Static Tests | 2026-09-26 | Example |
| [Vercel AI SDK](https://github.com/vercel/ai) | `vercel-ai/` | End-to-end testing | End-to-end testing | 2026-09-26 | Example |

### Gateways

| Integration | Source folder | Observe | Block tools | Last tested | Support |
| --- | --- | --- | --- | --- | --- |
| [Bifrost](https://github.com/maximhq/bifrost) | `bifrost/` | End-to-end testing | End-to-end testing | 2026-09-26 | Example |
| [Cloudflare AI Gateway](https://developers.cloudflare.com/ai-gateway/usage/providers/openai/) | `cloudflare-ai/` | Static Tests | Not available | 2026-09-26 | Example |
| [Helicone](https://docs.helicone.ai/features/webhooks) | `helicone/` | End-to-end testing | Not available | 2026-09-26 | Example |
| [Kong AI Proxy](https://developer.konghq.com/plugins/ai-proxy/examples/openai-chat-route/) | `kong-ai/` | End-to-end testing | End-to-end testing | 2026-09-26 | Example |
| [LiteLLM proxy](https://github.com/BerriAI/litellm) | `litellm/` | End-to-end testing | End-to-end testing | 2026-10-01 | Example |
| [OpenRouter](https://openrouter.ai/docs/quickstart) | `openrouter/` | Static Tests | Not available | 2026-09-26 | Example |
| [Portkey](https://github.com/Portkey-AI/gateway) | `portkey/` | End-to-end testing | End-to-end testing | 2026-09-26 | Example |

### Model libraries

| Integration | Source folder | Observe | Block tools | Last tested | Support |
| --- | --- | --- | --- | --- | --- |
| [Anthropic Messages](https://github.com/anthropics/anthropic-sdk-python) | `anthropic/` | Static Tests | Static Tests | 2026-09-26 | Example |
| [Cohere V2](https://github.com/cohere-ai/cohere-python) | `cohere/` | End-to-end testing | End-to-end testing | 2026-09-26 | Example |
| [Google Gen AI](https://github.com/googleapis/python-genai) | `google-genai/` | Static Tests | Static Tests | 2026-09-26 | Example |
| [Groq](https://github.com/groq/groq-python) | `groq/` | Static Tests | Static Tests | 2026-09-26 | Example |
| [Hugging Face Inference](https://github.com/huggingface/huggingface_hub) | `huggingface-inference/` | Static Tests | Static Tests | 2026-09-26 | Example |
| [Mistral AI](https://github.com/mistralai/client-python) | `mistralai/` | Static Tests | Static Tests | 2026-09-26 | Example |
| [Ollama](https://github.com/ollama/ollama-python) | `ollama/` | Static Tests | Static Tests | 2026-09-26 | Example |
| [OpenAI Responses and Chat Completions](https://github.com/openai/openai-python) | `openai/` | Static Tests | Static Tests | 2026-09-26 | Example |

### Compliance APIs

| Integration | Source folder | Observe | Block tools | Last tested | Support |
| --- | --- | --- | --- | --- | --- |
| [Claude Compliance API](https://platform.claude.com/docs/en/manage-claude/compliance-api) | `claude-compliance/` | Static Tests | Not available | 2026-09-26 | Example |

### Observability and SIEM

| Integration | Source folder | Export | Last tested | Support |
| --- | --- | --- | --- | --- |
| [Google Security Operations](https://docs.cloud.google.com/chronicle/docs/reference/rest/v1/projects.locations.instances.events/import) | `google-security-operations/` | Static Tests | 2026-09-26 | Example |
| [Microsoft Sentinel](https://learn.microsoft.com/en-us/azure/azure-monitor/logs/logs-ingestion-api-overview) | `microsoft-sentinel/` | Static Tests | 2026-09-26 | Example |
| [OpenTelemetry](https://opentelemetry.io/docs/specs/otlp/) | `opentelemetry/` | Static Tests | 2026-09-26 | Example |
| [Splunk](https://help.splunk.com/en/splunk-enterprise/get-started/get-data-in/9.4/get-data-with-http-event-collector) | `splunk/` | Static Tests | 2026-09-26 | Example |

<!-- END INTEGRATIONS -->

## Export destinations

Use these examples to send stored decisions, selected session summaries and
optional transcripts to an observability or SIEM destination. Open the source folder in your SDK checkout and follow its README.
The OpenTelemetry example has a separate setup section for each destination.

| Destination | Source folder | Transport |
| --- | --- | --- |
| [Grafana / Loki](https://grafana.com/docs/loki/latest/send-data/otel/) | `opentelemetry/` | OTLP logs through a Collector |
| [Datadog](https://docs.datadoghq.com/opentelemetry/setup/otlp_ingest/logs/) | `opentelemetry/` | OTLP logs through a Collector |
| [Splunk](https://help.splunk.com/en/splunk-enterprise/get-started/get-data-in/9.4/get-data-with-http-event-collector/format-events-for-http-event-collector) | `splunk/` | HTTP Event Collector |
| [Microsoft Sentinel](https://learn.microsoft.com/en-us/azure/azure-monitor/logs/logs-ingestion-api-overview) | `microsoft-sentinel/` | Azure Monitor Logs Ingestion into a custom table |
| [Elastic Cloud](https://www.elastic.co/docs/reference/opentelemetry/managed-inputs/managed-otlp-endpoint) | `opentelemetry/` | Managed OTLP endpoint through a Collector |
| [New Relic](https://docs.newrelic.com/docs/opentelemetry/best-practices/opentelemetry-otlp/) | `opentelemetry/` | OTLP logs through a Collector |
| [Dynatrace](https://docs.dynatrace.com/docs/ingest-from/opentelemetry/otlp-api) | `opentelemetry/` | OTLP logs through a Collector |
| [AWS CloudWatch Logs](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-OTLPEndpoint.html) | `opentelemetry/` | OTLP logs signed by the Collector |
| [OpenSearch](https://docs.opensearch.org/latest/data-prepper/) | `opentelemetry/` | OTLP through OpenSearch Ingestion or Data Prepper |
| [Google Security Operations](https://docs.cloud.google.com/chronicle/docs/reference/rest/v1/projects.locations.instances.events/import) | `google-security-operations/` | Chronicle v1 structured-event import |

An accepted request does not prove searchable records or an alert. The README
provides a destination check and states which local tests were run. Reconcile
late-arriving records and later decision changes before relying on scheduled
exports; occurrence-time windows do not provide a complete change feed.

## Choose the data flow

Coding agents and general-purpose agents connect through native tool hooks or
approval interfaces. Framework examples use the framework's scheduler or
callbacks. A hook can stop a tool only when the host waits for the decision
before dispatch. Read the example's timeout behavior and supported tool paths.

For unattended operation, a call that requires a human must remain withheld.
Examples with a human approval callback can pass that decision to an authorized
interface and record the choice. A local callback is not a built-in approval UI;
each README states what the example implements.

Gateway examples install monitoring on the gateway server. Clients using a
covered route need no Watcher library. Synchronous plugins can hold a model's
tool proposals before the client receives them. Export-only connections import
completed requests and cannot stop those requests. A gateway cannot prevent
action outside its covered routes or tools that already ran at the provider.

The [gateway hook](../api/hooks.md) accepts complete provider request/response
pairs or converted transcripts. Its configured
[enforcement mode](../concepts/blocking-and-trailing-review.md#enforcement-modes)
controls observation, enforcement and paused behavior through the same endpoint.
A successful submission does not prove durable recording. Verify the stored
conversation and decisions through the query API or
[Analyzer](../concepts/analyzer.md). Each gateway example starts every
conversation ID it sends with its own prefix, such as `litellm:`, so its
sessions show the Gateway source there. The LiteLLM example sends an ID only
when the client sets an `x-watcher-session-id` header. Without that header, its
sessions show Hooks API, as does a custom integration that sends other IDs.

Compliance API ingestion imports activity that has already happened. It supports
later review and cannot stop past tool calls.

Observability exports send stored decisions, selected session summaries and
optional transcripts to other systems. Transcript content is excluded unless
explicitly enabled. The public SDK does not expose a notification-delivery feed;
these examples export records, not notification events. Bounded query windows
are not a lossless stream of later changes.
