---
title: "Platforms and gateways: Zapier, LangChain, Spring AI, Cloudflare, Netlify, Vercel, OpenRouter, Fly.io, Pydantic AI and other hosted routes to Jev"
type: community
source_tier: community
tags: [community, integrations, gateways, platforms, frameworks]
created: 2026-09-24
updated: 2026-09-25
confidence: medium
sources:
  - raw/partner/pydantic-ai__models__typesafe.md
  - raw/partner/pydantic-ai__models__decision.md
  - raw/x/pydantic-2100812323027853812.md
  - raw/partner/langchain__oss__python__integrations__providers__typesafe.md
  - raw/partner/langchain__oss__javascript__integrations__providers__typesafe.md
  - raw/partner/spring-io__blog__spring-ai-typesafe-structured-judgment.txt
  - raw/community/vercel-com-kb-guide-typesafe-jev-and-ai-sdk.md
  - raw/partner/ai-sdk-dev__providers__ai-sdk-providers__typesafe-ai.md
  - raw/partner/eve-dev__docs__guides__evaluate.md
  - raw/partner/eve-dev__docs__evals__judge.md
  - raw/partner/eve-dev__docs__human-in-the-loop.md
  - raw/partner/eve-dev__docs__tools__workflows.md
  - raw/x-repos/vercel__eve.md
  - raw/partner/litellm__docs__pass_through__typesafe.txt
  - raw/partner/litellm__docs__auto_router__setup.txt
  - raw/partner/litellm__docs__proxy__guardrails__typesafe.txt
  - raw/community/docs-litellm-ai-blog-jev-auto-router-benchmark.md
  - raw/x-repos/BerriAI__litellm.md
  - raw/partner/boundaryml__blog__typesafe-ai-jev.txt
  - raw/partner/boundaryml__blog__baml-0.20.1.txt
  - raw/x-repos/BoundaryML__baml.md
  - raw/partner/tanstack__ai__latest__docs__adapters__typesafe.md
  - raw/partner/tanstack__ai__latest__docs__evaluate__evaluate.md
  - raw/x-repos/TanStack__ai.md
  - raw/x-repos/elie222__inbox-zero.md
  - raw/x-repos/Effect-TS__effect.md
  - raw/x-repos/ComposioHQ__composio.md
  - raw/partner/cloudflare__ai__models__typesafe__jev.md
  - raw/partner/netlify__changelog__typesafe-jev-ai-gateway.md
  - raw/partner/vercel__ai-gateway__models__providers__typesafe-ai.md
  - raw/partner/openrouter__docs__guides__community__typesafe-sdk.md
  - raw/partner/fly-io__sprites__jev.md
  - raw/partner/zapier__apps__typesafe-jev__integrations.md
  - raw/community/youtube-matthewberman-8-jev-use-cases.txt
  - raw/x/t0ng7u-2102062876819374482.md
  - raw/x-repos/yuyang2230__jev-agent-skill.md
  - raw/x-repos/PanAchy__jevvy.md
  - raw/x-repos/NandhaKishorM__laya.md
jev_version: "jev-1.13.0"
summary: "Already on a platform or framework? How Zapier, Cloudflare, Netlify, Vercel, eve, OpenRouter, Fly.io, LiteLLM, Pydantic AI, LangChain, BAML, TanStack call Jev, and where vendor docs differ."
---

# Platforms and gateways: Zapier, LangChain, Spring AI, Cloudflare, Netlify, Vercel, OpenRouter, Fly.io, Pydantic AI and other hosted routes to Jev

> **TL;DR** If the builder already runs on one of these, read its row before writing a client: the vendor may already wrap Jev. Each row is the vendor's own docs (captured 2026-09-23 to 25), checked against TypeSafe's; TypeSafe's docs win every conflict. No platform claims capacity independent of TypeSafe's. Rows that need your own TypeSafe key (direct providers, LiteLLM, BAML, TanStack's `typesafeDecider`, Inbox Zero) need an existing account: TypeSafe said on 2026-09-24 that direct signup is closed; hosted routes bill on the platform's own key ([[entities/typesafe-console]]). Community-built tools, MCP servers and unofficial SDKs: [[ideas/tools-and-integrations]].

Split from [[ideas/tools-and-integrations]] on 2026-09-24 (nothing dropped). Pattern IDs: [[ideas/patterns]]. "Our check" = our source or registry check on 2026-09-24 (docs/sweep record), not a raw capture.

| Already on | Row |
|---|---|
| Pydantic AI, LangChain, Spring AI, Vercel AI SDK (Gateway or `@ai-sdk/typesafe-ai`), eve, LiteLLM, BAML, TanStack AI, Effect, Composio | framework integrations |
| Inbox Zero | apps with a built-in Jev option |
| Zapier, Cloudflare Workers AI, Netlify, Vercel AI Gateway, OpenRouter, Fly.io Sprites | platforms and gateways |

## Framework integrations (shipped by the framework's maintainers)

| Tool | Does | Install | ★ · push | Note |
|---|---|---|---|---|
| Pydantic AI `TypeSafeModel` ([docs](https://pydantic.dev/docs/ai/models/typesafe.md), [decision models](https://pydantic.dev/docs/ai/models/decision/), [post](https://x.com/pydantic/status/2100812323027853812)) | **official, by Pydantic**: `Agent('typesafe:jev-latest', output_type=...)`, fields become questions, unions and tools become routes. Since 2026-09-25 a subclass of the generic `DecisionModel`: settings `decision_boolean_threshold`, `decision_route_threshold` (old `typesafe_tool_call_threshold` ignored); unsure or unfillable routes hand off to an LLM via `FallbackModel` | `pip install "pydantic-ai-slim[typesafe]"` | Pydantic docs · 2026-09-25 | Jev limits (255 options, 10 levels, 32k/64k), aliases, retries `verified`; `max_tokens_exceeded` not in TypeSafe docs (`unverified`); `bool` confidence is Pydantic's own margin → [[reference/pydantic-ai]]. P02, P03, P07, P08, P12, P15 |
| LangChain `TypeSafeClassifier` ([Python](https://docs.langchain.com/oss/python/integrations/providers/typesafe), [JS](https://docs.langchain.com/oss/javascript/integrations/providers/typesafe) docs) | **by LangChain**: a Runnable (invoke, batch, pipe). Python `invoke({"state", "questions"})` with `Noul`/`Choice`/`Score`; answers on `.nouls`/`.choices`/`.scores`, plus `model`, `usage`, `request_id`; state may be messages; experimental `ModelRouterMiddleware`, `AutoModeMiddleware`; LangSmith traces. JS: questions set in the constructor, `invoke(state)`, `timeout` 30000 ms, `maxRetries` 2 | `pip install langchain-typesafe`; `npm install @langchain/typesafe @langchain/core` | LangChain docs · 2026-09-24 | same package as @LangChain's `0.0.1a2` post ([[ideas/measurements]]). Key, base URL, answer fields `verified` ([[concepts/primitives]]). Python moved `questions` to `invoke`; JS `stream` yields the whole result. P02, P03 |
| Spring AI TypeSafe ([post](https://spring.io/blog/2026/09/21/spring-ai-typesafe-structured-judgment), [repo](https://github.com/spring-ai-community/spring-ai-typesafe)), Christian Tzolov | **Spring AI Community** project: `TypeSafeClient` bean; `JevJudge`, `JevSelfRefineAdvisor`, `JevGuardrailAdvisor`, `JevDocumentFilter`, `JevDocumentReranker`, `JevToolIndex`, `JevEvaluator` on Spring AI SPIs; plain Java: `typesafe-java-sdk` | Maven `org.springaicommunity:spring-ai-starter-typesafe:0.1.0`; `TYPESAFE_API_KEY` or `spring.ai.typesafe.api-key` | 0.1.0 · post 2026-09-21 | author: median 275 ms (1 question), 310 ms (3), laptop. Guard thresholds (block > 0.70, review ≥ 0.35) are Spring's. Bare number or boolean `state` → `422` `verified` ([[concepts/state]]). P15, P16 |
| Vercel AI SDK via Gateway ([guide](https://vercel.com/kb/guide/typesafe-jev-and-ai-sdk)) | `experimental_evaluate`, `ai` ≥ 7.0.105, `typesafe-ai/jev` | `npm i ai` | Vercel doc | limits, price `verified`; its `boolean` = API `noul`; per-request ZDR `unverified`. Direct route: next row |
| `@ai-sdk/typesafe-ai` ([docs](https://ai-sdk.dev/providers/ai-sdk-providers/typesafe-ai)), Vercel AI SDK direct provider | **by Vercel**: `typeSafeAi.evaluationModel('jev-latest')` in `experimental_evaluate`, straight to TypeSafe (no Gateway); `choice`, `score`, `boolean` (sent as `noul`), all questions in one request; `createTypeSafeAi({apiKey, baseURL, headers, fetch})`; Choice and Score confidence under `result.providerMetadata.typesafe.confidence[questionId]`; failures as `APICallError`, AI SDK core retries `429`/`529` with `maxRetries` 2, no provider-side retry; evaluation models only (language, embedding, image factories throw `NoSuchModelError`) | `pnpm add @ai-sdk/typesafe-ai`; key env **`TYPESAFE_AI_API_KEY`** (not `TYPESAFE_API_KEY`); base `https://api.typesafe.ai/v1` | npm 3.0.6, 2026-09-23 (our check) | 255-option max, 2–10 levels, no confidence on a yes/no, `429`/`529` retryable `verified` ([[reference/http-api]], [[reference/rate-limits-and-errors]]); its "1–255 options": docs state only the maximum. "TypeSafe returns scores and probabilities rounded to two decimals" is not in TypeSafe's docs: `unverified`. eve uses it for direct access. Env names: [[reference/environment-variables]]. P02, P16 |
| [eve](https://github.com/vercel/eve), Vercel's agent framework ([evaluate](https://eve.dev/docs/guides/evaluate), [judge](https://eve.dev/docs/evals/judge), [approvals](https://eve.dev/docs/human-in-the-loop), [workflows](https://eve.dev/docs/tools/workflows) docs) | **by Vercel**: `typesafe-ai/jev` is the default evaluator in five opt-in features. `evaluate()` (`eve/ai`): typed questions inside tools. `auto()` (`eve/models`): picks the turn's model from described options, reading up to 8 recent messages within 16,000 characters, reused for the whole turn. Tool approval `auto()` (`eve/tools/approval`): `clear` or `caution`; caution, a failed review or incomplete input goes to a person, and the tool input goes to the provider. `agentRouter()` (`eve/tools/agent-router`): picks among described subagents; a sole target skips the call. `t.judge` in evals: a yes/no judge scores its probability (eve: "not guaranteed calibrated"); missing credentials or provider errors fail the gate and never switch model | model strings via Vercel AI Gateway (`AI_GATEWAY_API_KEY` or Vercel OIDC); direct: `@ai-sdk/typesafe-ai` + `typeSafeAi.evaluationModel("jev-latest")` | docs captured 2026-09-25 | Any AI SDK evaluation model can replace Jev. eve warns the AI SDK evaluation spec is experimental and can change in patch releases. The approvals page moved from `/docs/tools/human-in-the-loop` to `/docs/human-in-the-loop` and now documents `auto()`. In beta under Vercel's public-beta terms (README). Choice/Score/yes-no semantics `verified` ([[concepts/primitives]]). P02, P03, P05, P15 |
| LiteLLM, BerriAI ([pass-through](https://docs.litellm.ai/docs/pass_through/typesafe), [Auto Router](https://docs.litellm.ai/docs/auto_router/setup), [guardrail](https://docs.litellm.ai/docs/proxy/guardrails/typesafe) docs) | **by LiteLLM**, three opt-in proxy features. (1) Pass-through: any path under `/typesafe/` is forwarded (`POST {proxy}/typesafe/v1/systemone`, `GET .../v1/models`) with a LiteLLM virtual key; the proxy adds the TypeSafe key; the response is TypeSafe's, unchanged; spend priced from `usage` and registry entries `typesafe/jev-1.13.0`, `jev-latest`, `jev-preview`, logged under the versioned model. (2) Auto Router `classifier_type: jev`: one Choice `questions.tier` over the tier descriptions picks the completion model; `jev_classifier_config` defaults `jev-latest`, `timeout_ms` 3000, circuit breaker on (30 s cooldown); a timeout, HTTP failure, bad body, unknown tier or open breaker takes the configured fallback (heuristic by default); up to three prior user turns (8,000 characters) go to TypeSafe; Test Routing can incur a Jev charge; the built-in classifier is in OSS, custom instructions and `tier_definitions` need Enterprise. (3) Guardrail `typesafe` (`mode: pre_call`, `default_on` false): one Noul per completed tool exchange ("still needed?"; the 200 most recent, results ≥ `min_chars_to_evaluate` 200, trimmed to `max_result_chars_in_state` 4000); below `relevance_threshold` (0.2 in the docs example) the result is blanked; `unreachable_fallback` `fail_open` by default (30 s budget) | on the proxy: `TYPESAFE_API_KEY`, optional `TYPESAFE_API_BASE` (default `https://api.typesafe.ai`) | all three in stable v1.101.1 and v1.102.1, 2026-09-23 (our check) | Base URL, `jev-preview` alias, $0.042/Mtok input with output free `verified` ([[reference/models-and-pricing]]). `fail_closed`: docs say HTTP 500, the [code at `3fa02ef`](https://github.com/BerriAI/litellm/blob/3fa02ef9fcc287a8648c6d5bc998d9962915699e/litellm/proxy/guardrails/guardrail_hooks/typesafe/typesafe.py#L203) raises 502 (our check): handle both. **LiteLLM reports** ([benchmark post](https://docs.litellm.ai/blog/jev-auto-router-benchmark), Moe Khalil, 2026-09-20; vendor measurement): 80 self-labelled cases × 3 on `jev-1.13.0` vs Claude Haiku 4.5, tier match 95.00% vs 73.75%, p50 126.81 vs 688.40 ms, classifier cost 96% lower at registry prices; its own limits: labels not independently reviewed, prompts untuned, answer quality not measured, long cases 87.5%, tested tree not a release ([[ideas/head-to-head]]). P02, P07 |
| BAML, BoundaryML ([announcement](https://boundaryml.com/blog/typesafe-ai-jev), [0.20.1 notes](https://boundaryml.com/blog/baml-0.20.1)) | **by BoundaryML** (BAML v1): `client "typesafeai/jev-latest"`, and the function's return type picks the questions: `bool` = Noul thresholded at 0.5, `float` = the Noul probability, enum or finite literal union = Choice (an optional enum adds a `"<null>"` abstain option), class = one question per leaf field in one request (nested classes become dotted IDs). **No Score mapping.** Typed results drop probabilities and confidence (read the response envelope through the event hook). Rejected at runtime before any HTTP call: free-form string/int, arrays, maps, recursive or optional classes, `bool?`/`float?`, media, tools, streaming, empty instructions | `typesafeai.Client.new(model, api_key=env.TYPESAFE_API_KEY, base_url, request_timeout_ms, capture_wire)`; default endpoint `https://api.typesafe.ai/v1/systemone` | 0.20.1, post 2026-09-20 (the post says canary; GitHub release not a prerelease, our check); announced 2026-09-17 by Sam Lijin | 255-option max `verified` ([[reference/http-api]]); BAML also demands ≥ 2 options. Wire capture on by default (auth headers redacted). A `route_confidence: float` field asks a new Noul; it does not read the Choice's confidence. P01 |
| TanStack AI `@tanstack/ai-typesafe` ([adapter](https://tanstack.com/ai/latest/docs/adapters/typesafe), [evaluate](https://tanstack.com/ai/latest/docs/evaluate/evaluate) docs) | **by TanStack**: `decide({adapter, state, questions})` with `choice()`, `score()` (`levels`), `boolean()`; answers `.value`, `.probability`, `.confidence` (none on `boolean`), `.probabilities`; Score `.value` = nearest level, `.score` = raw fraction; `boolean` `.value` is true at ≥ 0.5 (TanStack's rule); usage and model on `result.meta`. Plain `fetch`, no TypeSafe SDK, no stream. Four transports, same call: `typesafeDecider('jev-latest')` (`TYPESAFE_API_KEY`), `openRouterDecider('~typesafe/jev-latest')` (`OPENROUTER_API_KEY`), `vercelGatewayDecider('typesafe-ai/jev')` (`AI_GATEWAY_API_KEY`), `cloudflareDecider('typesafe/jev')` | `@tanstack/ai @tanstack/ai-typesafe`; `createTypesafeDecider(model, apiKey, {baseURL, defaultHeaders, fetch, timeout})`, default base `https://api.typesafe.ai` | npm 0.1.0, 2026-09-21 (our check) | Model IDs `jev-latest`, `jev-1.13.0`, base URL and the three gateway IDs `verified` (TypeSafe docs; rows below). P01, P05 |
| [Effect](https://github.com/Effect-TS/effect), [Composio](https://github.com/ComposioHQ/composio) | `@effect/ai-typesafe`; `@composio/typesafe`, `composio-typesafe` | npm / PyPI | 16184, 30293 · 2026-09-23 | READMEs only list them |

## Apps with a built-in Jev option

| App | What Jev does | Turn it on | Status | Note |
|---|---|---|---|---|
| [Inbox Zero](https://github.com/elie222/inbox-zero) (elie222; open-source email assistant, 12314★ on 2026-09-23; [decision-model code at `de44248`](https://github.com/elie222/inbox-zero/tree/de44248153af42a224b28e0395ea7454c945d318/apps/web/utils/decision-model)) | optional "specialized decision model": Choice over the user's rules, cold-email yes/no, sender categories, thread status, unsubscribe pages, reply-memory selection; raw fetch to `/v1/systemone`, 30 s timeout | operator sets `DEFAULT_DECISION_MODEL=typesafe:<model>` and `TYPESAFE_API_KEY`; `DEFAULT_DECISION_MODEL_ENABLED` (default false) decides whether users who have not chosen get it; users with their own AI key never get it by default; per-user Settings toggle | merged to main 2026-09-19 and 2026-09-21, **no tagged release** (last web tag 2026-05-18); whether the hosted app runs it is not stated | our code read, not captured (`unverified` beyond that). Any error, or a Choice probability under 0.3, falls back to the normal LLM path. `jev-latest` priced at $42 per billion input tokens, output free: `verified`. P22 |

## Platforms and gateways

Platforms' own pages, captured 2026-09-24 (Cloudflare, Zapier re-captured 2026-09-25). Their prices and terms apply; none claims capacity independent of TypeSafe's.

| Platform (who ships it) | How you call Jev | Differs from calling TypeSafe | Checked |
|---|---|---|---|
| Cloudflare Workers AI ([docs](https://developers.cloudflare.com/ai/models/typesafe/jev/)), Cloudflare, tagged "Third-party" | `env.AI.run('typesafe/jev', {state, questions})` in a Worker, or `POST https://api.cloudflare.com/client/v4/accounts/$CLOUDFLARE_ACCOUNT_ID/ai/run` with `{"model": "typesafe/jev", "input": {...}}` | Cloudflare token, no TypeSafe key; price only in the dashboard; lists "Zero data retention: Yes" since 2026-09-25 (Cloudflare's claim, `unverified`: TypeSafe's docs offer ZDR only to enterprise customers via sales, [[reference/legal-and-data]]); inputs `state`, `questions` only, so no version pin (examples answer `jev-1.13.0`); no SDK route shown | Shapes `verified` ([[reference/http-api]]). Its "32,000 tokens" is TypeSafe's state + longest question budget; the 64k total is not listed ([[reference/models-and-pricing]]) |
| Netlify AI Gateway ([changelog](https://www.netlify.com/changelog/typesafe-jev-ai-gateway/)), Netlify | `@typesafe-ai/sdk` in a Function: `new TypeSafeClient()`, no key or base URL | Gateway injects credentials; billed to Netlify credits; JS only | `jev-latest` = `jev-1.13.0`, Node ≥ 20, `choice(..., {label: null})`, 70–500 ms `verified`. "State and questions share roughly 32,000 tokens" `contradicts docs` (64k per request; 32k = state + longest question) |
| Vercel AI Gateway ([provider page](https://vercel.com/ai-gateway/models/providers/typesafe-ai)), Vercel | `typesafe-ai/jev`: AI SDK `experimental_evaluate` (framework table above), or an SDK with base URL `https://ai-gateway.vercel.sh/typesafe` and `AI_GATEWAY_API_KEY` | Vercel key and billing; ZDR, No Training per request (guide, `unverified`) | Base URL `verified` ([[reference/python-sdk-internals]]). Page lists 32K context, input and output "Free", free tier, released 09/15/2026; Vercel's guide says $0.042/M input, as TypeSafe does: `unverified`, check the dashboard |
| OpenRouter ([guide](https://openrouter.ai/docs/guides/community/typesafe-sdk)), OpenRouter | An SDK with base URL `https://openrouter.ai/api` and an OpenRouter key (or the two `TYPESAFE_*` variables); `jev-1.13` → `typesafe/jev-1.13`, `jev-latest` → `~typesafe/jev-latest`. Also its own Decisions API and TS, Python, Go SDKs | Billed to OpenRouter; `model` is OpenRouter's ID (e.g. `typesafe/jev-1.13-20260917`), plus `id`, `provider`, `usage.cost`; the SDK's model listing fails (OpenRouter's `/api/v1/models` shape) | Base URL, `~typesafe/jev-latest` `verified` ([[reference/python-sdk-internals]]). `jev-1.13` is OpenRouter's name (TypeSafe: `jev-1.13.0`). Answers name `provider: "TypeSafe"`: a proxy, not separate capacity (inferred) |
| Fly.io Sprites ([page](https://fly.io/sprites/jev/)), Fly.io | TypeSafeAI connector; in the Sprite, `TYPESAFE_BASE_URL=https://api.sprites.dev/v1/gateway/typesafe/<connection_id>`, any placeholder `TYPESAFE_API_KEY` | Your key sits encrypted in the Fly org, attached by the gateway, never in the Sprite; access per Sprite (name prefix, labels, org); only `POST /v1/systemone`, `GET /v1/models` pass, others `403`; `429`/`529` and `retry-after` passed through. Billed on your key (inferred) | Base URL without `/v1` `verified` ([[reference/environment-variables]]). Its illustration gives a yes/no answer a confidence: `contradicts docs` ([[concepts/noul]]) |
| Zapier ([app page](https://zapier.com/apps/typesafe-jev/integrations)), Zapier | TypeSafe Jev app with one action, **Ask Questions** (write; no triggers listed): `Content` required; optional yes/no questions, one pick-one (name, question, options), one scale (name, question, levels lowest first), a minimum confidence, and what to do when an answer is unsure. Also on Zapier MCP. Popular integrations listed: Gmail, Google Calendar (both new 2026-09-25), Airtable, ActiveCampaign | No code: a step between any Zapier apps. Auth and billing not stated on the page; one pick-one and one scale per step (inferred from the fields) | Noul, Choice, Score shapes, levels low to high `verified` ([[concepts/primitives]], [[concepts/score]]). "returns each answer with a confidence score" `contradicts docs` for yes/no: a Noul answer is only a probability ([[concepts/noul]]), so that gate is Zapier's own (inferred). Shown in Matthew Berman's **sponsored** segment of 2026-09-24 (a Zap accepting or declining calendar invites) |

- **New API** plugin ([@t0ng7u](https://x.com/t0ng7u/status/2102062876819374482)) and **OpenCode Zen** (Jevvy; [jev-agent-skill](https://github.com/yuyang2230/jev-agent-skill), model `jev-1.13-free` at $0): `unverified`.
- **impossibl** serves Laya, not Jev, on a compatible endpoint.

Gateways are not failover: see [[guides/production-operations]] §8. Access to TypeSafe directly: [[entities/typesafe-console]].

## Related

- [[ideas/tools-and-integrations]] — community MCP servers, skills, plugins, CLIs, libraries; [[ideas/sdks-and-replicas]] — community SDKs by language, open replicas
- [[ideas/measurements]] — gateway numbers and access routes; [[reference/environment-variables]] — base URL and keys, incl. third-party names
- [[ideas/head-to-head]] — LiteLLM's classifier benchmark in context
- [[reference/pydantic-ai]] — the Pydantic AI integration in depth

## Sources

Links inline; raw captures in frontmatter (vendor pages under raw/partner/ captured 2026-09-24 or 25; LiteLLM's benchmark post 2026-09-25; Vercel's AI SDK guide 2026-09-23; dates in raw/MANIFEST.json). Inbox Zero, LiteLLM's 502 and the version numbers marked "our check" come from the 2026-09-24 source and registry check, not from raw captures.
