---
title: "TypeSafe"
description: "Adds instrumentation for TypeSafe Jev evaluations. (default)"
url: https://docs.sentry.io/platforms/javascript/guides/remix/configuration/integrations/typesafe/
---

# TypeSafe for Remix

Requires Sentry SDK version `11.1.0` or higher.

*Import name: `Sentry.typesafeIntegration`*

This integration is enabled by default when [tracing](https://docs.sentry.io/platforms/javascript/guides/remix/tracing.md) is enabled. To customize it, see [Modifying Default Integrations](https://docs.sentry.io/platforms/javascript/guides/remix/configuration/integrations.md#modifying-default-integrations).

The `typesafeIntegration` adds instrumentation for [`@typesafe-ai/sdk`](https://www.npmjs.com/package/@typesafe-ai/sdk) to capture [agent tracing](https://docs.sentry.io/platforms/javascript/guides/remix/agent-tracing.md) `gen_ai.evaluate` spans, recording model, token usage, latency, and (when enabled) evaluation inputs and answers.

If you call Jev through Vercel AI SDK's `experimental_evaluate()`, see the [Vercel AI integration](https://docs.sentry.io/platforms/javascript/guides/node/configuration/integrations/vercelai.md#trace-jev-evaluations) instead.

```javascript
Sentry.init({
  dsn: "https://<key>@o<orgId>.ingest.sentry.io/<projectId>",
  // Tracing must be enabled for agent tracing to work
  tracesSampleRate: 1.0,
  integrations: [Sentry.typesafeIntegration()],
});
```

## [Supported Operations](https://docs.sentry.io/platforms/javascript/guides/remix/configuration/integrations/typesafe.md#supported-operations)

Tracing support is added to `TypeSafeClient.systemOne()` calls to evaluate state against a set of questions using Jev. Each call creates a `gen_ai.evaluate` span. Recorded answers include probabilities and confidence values when returned by TypeSafe.

## [Supported Versions](https://docs.sentry.io/platforms/javascript/guides/remix/configuration/integrations/typesafe.md#supported-versions)

* `@typesafe-ai/sdk`: `>=0.5.0 <1`

## [Options](https://docs.sentry.io/platforms/javascript/guides/remix/configuration/integrations/typesafe.md#options)

Evaluation state and answers can contain sensitive data. Input and output recording are enabled by default. To disable them for TypeSafe, configure the integration explicitly:

```javascript
Sentry.init({
  dsn: "https://<key>@o<orgId>.ingest.sentry.io/<projectId>",
  tracesSampleRate: 1.0,
  integrations: [
    Sentry.typesafeIntegration({
      recordInputs: false,
      recordOutputs: false,
    }),
  ],
});
```

### [`recordInputs`](https://docs.sentry.io/platforms/javascript/guides/remix/configuration/integrations/typesafe.md#recordinputs)

*Type: `boolean` (optional)*

Records evaluation `state` and `questions`. Defaults to `dataCollection.genAI.inputs`, which is `true` by default.

### [`recordOutputs`](https://docs.sentry.io/platforms/javascript/guides/remix/configuration/integrations/typesafe.md#recordoutputs)

*Type: `boolean` (optional)*

Records evaluation `answers`. Defaults to `dataCollection.genAI.outputs`, which is `true` by default.

## [Manual Instrumentation](https://docs.sentry.io/platforms/javascript/guides/remix/configuration/integrations/typesafe.md#manual-instrumentation)

*Import name: `Sentry.instrumentTypeSafeClient`*

If your application does not use automatic instrumentation, wrap your TypeSafe client after setting up Sentry. Use the returned client for your `systemOne()` calls.

```javascript
import * as Sentry from "<sdk-package-name>";
```

```javascript
import { TypeSafeClient, choice } from "@typesafe-ai/sdk";

const typesafe = new TypeSafeClient({ apiKey: "your-typesafe-api-key" });
const client = Sentry.instrumentTypeSafeClient(typesafe, {
  recordInputs: false,
  recordOutputs: false,
});

const result = await client.systemOne({
  state: "I was charged twice. Please refund the extra charge.",
  questions: {
    department: choice("Which team should handle this?", {
      billing: "Charges and refunds",
      technical: "Bugs and outages",
    }),
  },
});
```

Use one instrumentation approach for each client. If automatic instrumentation is already active, you don't need to wrap the client.
