> ## Documentation Index
> Fetch the complete documentation index at: https://concentrate.ai/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Migrate from Vercel AI Gateway

> Move from Vercel AI Gateway to Concentrate AI: code changes for the AI SDK and OpenAI client, model IDs, auth, and feature differences.

<Tabs>
  <Tab title="Native AI SDK">
    <CodeGroup>
      ```javascript JavaScript (@ai-sdk/gateway) theme={null}
      // Before
      import { generateText } from "ai";

      const { text } = await generateText({
        model: "anthropic/claude-opus-4.7",
        prompt: "Say hello in one word",
      });
      // Auth read from AI_GATEWAY_API_KEY (or VERCEL_OIDC_TOKEN) in the environment

      // After
      import { createOpenAI } from "@ai-sdk/openai";
      import { generateText } from "ai";

      const concentrate = createOpenAI({
        baseURL: "https://api.concentrate.ai/v1",
        apiKey: process.env.CONCENTRATE_API_KEY,
      });

      const { text } = await generateText({
        model: concentrate("anthropic/claude-opus-4-6"),
        prompt: "Say hello in one word",
      });
      ```
    </CodeGroup>
  </Tab>

  <Tab title="OpenAI SDK">
    <CodeGroup>
      ```python Python (OpenAI SDK) theme={null}
      # Before
      from openai import OpenAI
      import os

      client = OpenAI(
          base_url="https://ai-gateway.vercel.sh/v1",
          api_key=os.environ["AI_GATEWAY_API_KEY"],
      )

      # After
      from openai import OpenAI
      import os

      client = OpenAI(
          base_url="https://api.concentrate.ai/v1",
          api_key=os.environ["CONCENTRATE_API_KEY"],
      )
      ```

      ```javascript JavaScript (OpenAI SDK) theme={null}
      // Before
      import OpenAI from "openai";

      const client = new OpenAI({
        baseURL: "https://ai-gateway.vercel.sh/v1",
        apiKey: process.env.AI_GATEWAY_API_KEY,
      });

      // After
      const client = new OpenAI({
        baseURL: "https://api.concentrate.ai/v1",
        apiKey: process.env.CONCENTRATE_API_KEY,
      });
      ```

      ```bash cURL theme={null}
      # Before
      curl https://ai-gateway.vercel.sh/v1/chat/completions \
        -H "Authorization: Bearer $AI_GATEWAY_API_KEY" \
        -H "Content-Type: application/json" \
        -d '{ "model": "openai/gpt-5.5", "messages": [...] }'

      # After
      curl https://api.concentrate.ai/v1/chat/completions \
        -H "Authorization: Bearer $CONCENTRATE_API_KEY" \
        -H "Content-Type: application/json" \
        -d '{ "model": "openai/gpt-5.5", "messages": [...] }'
      ```
    </CodeGroup>
  </Tab>

  <Tab title="Anthropic SDK">
    <Warning>
      Watch the base URL. On Vercel, the Anthropic SDK points at `https://ai-gateway.vercel.sh` with **no** `/v1` (the SDK appends `/v1/messages` itself), while the OpenAI surfaces use `…/v1`. On Concentrate both surfaces share the same `…/v1` base.
    </Warning>

    <CodeGroup>
      ```python Python theme={null}
      # Before
      from anthropic import Anthropic
      import os

      client = Anthropic(
          base_url="https://ai-gateway.vercel.sh",
          api_key=os.environ["AI_GATEWAY_API_KEY"],
      )

      # After
      # (Concentrate also exposes an Anthropic-compatible Messages API at /v1/messages.)
      from openai import OpenAI
      import os

      client = OpenAI(
          base_url="https://api.concentrate.ai/v1",
          api_key=os.environ["CONCENTRATE_API_KEY"],
      )
      ```

      ```javascript JavaScript theme={null}
      // Before
      import Anthropic from "@anthropic-ai/sdk";

      const client = new Anthropic({
        baseURL: "https://ai-gateway.vercel.sh",
        apiKey: process.env.AI_GATEWAY_API_KEY,
      });

      // After
      import OpenAI from "openai";

      const client = new OpenAI({
        baseURL: "https://api.concentrate.ai/v1",
        apiKey: process.env.CONCENTRATE_API_KEY,
      });
      ```

      ```bash cURL theme={null}
      # Before
      curl https://ai-gateway.vercel.sh/v1/messages \
        -H "x-api-key: $AI_GATEWAY_API_KEY" \
        -H "Content-Type: application/json" \
        -d '{ "model": "anthropic/claude-opus-4.7", "messages": [...] }'

      # After
      curl https://api.concentrate.ai/v1/messages \
        -H "Authorization: Bearer $CONCENTRATE_API_KEY" \
        -H "Content-Type: application/json" \
        -d '{ "model": "anthropic/claude-opus-4-6", "messages": [...] }'
      ```
    </CodeGroup>
  </Tab>
</Tabs>

## Prerequisites

<Steps>
  <Step title="A Concentrate AI account with an active API key">
    Sign up or log in at [concentrate.ai](https://concentrate.ai) and create an API key. Your key should start with `sk-cn-v1-`.
  </Step>

  <Step title="An existing Vercel AI Gateway integration">
    This guide assumes you are calling AI Gateway from the AI SDK (`@ai-sdk/gateway`), the OpenAI SDK (Chat Completions or Responses), the Anthropic SDK, `fetch`, `requests`, or another HTTP client.
  </Step>
</Steps>

## Quick Start for Claude Code users

If you use [Claude Code](https://claude.com/claude-code), you can install a skill that walks through this migration interactively. It searches your project for AI Gateway usage, collapses the per-surface base URLs (including the Anthropic-base-URL trap), strips Vercel-specific headers, decomposes `providerOptions.gateway`, maps model slugs, and generates a verification script. Drop the skill into your `~/.claude/skills/` directory:

```bash theme={null}
mkdir -p ~/.claude/skills/migrate-vercel && \
  curl -fsSL https://concentrate.ai/scripts/migrate-vercel.md \
  -o ~/.claude/skills/migrate-vercel/SKILL.md
```

Then start a Claude Code session in your project and ask it to "migrate from Vercel AI Gateway to Concentrate" or run `/migrate-vercel`. Claude will load the skill and run the steps.

<Note>
  If you were running Claude Code itself *through* AI Gateway (via `ANTHROPIC_BASE_URL=https://ai-gateway.vercel.sh`), point it at Concentrate instead. See the [Claude Code integration guide](/docs/integrations/claude-code).
</Note>

## Step 1: Update Your Environment Variables

Replace your AI Gateway key (and any BYOK provider keys) with a single Concentrate key:

```bash theme={null}
# Before
export AI_GATEWAY_API_KEY="vck_..."
export BASE_URL="https://ai-gateway.vercel.sh/v1"

# After
export CONCENTRATE_API_KEY="sk-cn-v1-..."
export BASE_URL="https://api.concentrate.ai/v1"
```

<Warning>
  If you authenticated with a Vercel OIDC token (`VERCEL_OIDC_TOKEN`, auto-provisioned on Vercel deployments and valid for \~12 hours), that mechanism does not carry over. Concentrate keys never expire unless revoked, so the `process.env.AI_GATEWAY_API_KEY || process.env.VERCEL_OIDC_TOKEN` fallback pattern collapses to a single `CONCENTRATE_API_KEY`. If you ran any BYOK credentials, you no longer need `OPENAI_API_KEY`, `ANTHROPIC_API_KEY`, AWS credentials, or any other upstream provider key in your environment — Concentrate manages provider credentials by default, and if you want to keep using your own keys, store them once in the dashboard with [BYOK](/docs/api-reference/endpoint/byok).
</Warning>

## Step 2: Update Your Client

The two big changes are collapsing the base URL onto `https://api.concentrate.ai/v1` and dropping Vercel-specific headers and `providerOptions.gateway` fields. If you used the native `@ai-sdk/gateway` provider, swap to `@ai-sdk/openai` pointed at Concentrate. Concentrate does not ship a dedicated SDK because the OpenAI-compatible shape covers every endpoint.

<Warning>
  **Anthropic base-URL difference.** Vercel's Anthropic surface uses `https://ai-gateway.vercel.sh` with **no** `/v1`; the OpenAI surfaces use `…/v1`. Concentrate uses the same `https://api.concentrate.ai/v1` base for every surface, so if you were special-casing the Anthropic base URL, remove that branch.
</Warning>

<CodeGroup>
  ```python Python (OpenAI SDK) theme={null}
  # Before
  from openai import OpenAI
  import os

  client = OpenAI(
      base_url="https://ai-gateway.vercel.sh/v1",
      api_key=os.environ["AI_GATEWAY_API_KEY"],
  )

  # After
  from openai import OpenAI
  import os

  client = OpenAI(
      base_url="https://api.concentrate.ai/v1",
      api_key=os.environ["CONCENTRATE_API_KEY"],
  )

  response = client.chat.completions.create(
      model="anthropic/claude-opus-4-6",
      messages=[{"role": "user", "content": "Say hello in one word"}],
  )
  print(response.choices[0].message.content)
  ```

  ```javascript JavaScript (@ai-sdk/gateway → @ai-sdk/openai) theme={null}
  // Before
  import { generateText } from "ai";
  // model: "anthropic/claude-opus-4.7" resolves to AI Gateway automatically

  // After
  import { createOpenAI } from "@ai-sdk/openai";
  import { generateText } from "ai";

  const concentrate = createOpenAI({
    baseURL: "https://api.concentrate.ai/v1",
    apiKey: process.env.CONCENTRATE_API_KEY,
  });

  const { text } = await generateText({
    model: concentrate("anthropic/claude-opus-4-6"),
    prompt: "Say hello in one word",
  });
  console.log(text);
  ```

  ```bash cURL theme={null}
  curl https://api.concentrate.ai/v1/chat/completions \
    -H "Content-Type: application/json" \
    -H "Authorization: Bearer $CONCENTRATE_API_KEY" \
    -d '{
      "model": "anthropic/claude-opus-4-6",
      "messages": [{"role": "user", "content": "Say hello in one word"}]
    }'
  ```
</CodeGroup>

## Step 3: Remove Vercel-Specific Headers

None of AI Gateway's custom headers carry over to Concentrate, so they should come out. They're dead weight in your client config and mislead future readers. Expand the tables below for the full mapping if any of these are in your code.

<AccordionGroup>
  <Accordion title="Request header mapping" icon="arrow-right-arrow-left">
    | Vercel header                                                                           | Concentrate replacement                                                                                                            |
    | --------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------- |
    | `Authorization: Bearer vck_...`                                                         | Standard `Authorization: Bearer sk-cn-v1-...`                                                                                      |
    | `x-api-key` (Anthropic surface only)                                                    | Standard `Authorization: Bearer sk-cn-v1-...`. Concentrate's Messages API also accepts `x-api-key` for Anthropic-SDK compatibility |
    | `http-referer` (app attribution)                                                        | Drop. No per-request app attribution; analytics roll up by key/team/org                                                            |
    | `x-title` (app attribution)                                                             | Drop. No per-request app attribution                                                                                               |
    | Auto-injected o11y headers (`VERCEL_DEPLOYMENT_ID`, `VERCEL_PROJECT_ID` via the AI SDK) | Drop. Concentrate records its own per-request telemetry in the dashboard                                                           |
  </Accordion>

  <Accordion title="Response header mapping" icon="arrow-left">
    | Vercel response surface                                                            | Concentrate equivalent                                                                           |
    | ---------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------ |
    | `providerMetadata.gateway` (routing info, cost, service tier in the response body) | No body field. The resolved provider and cost are recorded per request in the dashboard          |
    | Request / trace id                                                                 | `X-Request-Id` (Concentrate returns its own per-request id, surfaced in dashboard logs)          |
    | Rate-limit headers                                                                 | Standard `X-RateLimit-*` headers. See [Errors](/docs/api-reference/endpoint/errors) for 429 semantics |
  </Accordion>
</AccordionGroup>

## Step 4: Decompose Your `providerOptions.gateway`

AI Gateway layers routing, fallback, caching, and compliance controls onto the standard request body under `providerOptions.gateway` (and a few top-level fields). A naïve "just change the base URL" migration silently drops these. Concentrate has no `providerOptions.gateway` primitive. Each behavior is either on by default or expressed as a body param on the request. Expand the table below for the full mapping.

<Accordion title="`providerOptions.gateway` key mapping" icon="arrow-right-arrow-left">
  | Vercel option                                              | Concentrate equivalent                                                                                                                                            |
  | ---------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- |
  | `order: [...]` (ordered provider fallback)                 | `routing.provider.fallbacks` (ordered)                                                                                                                            |
  | `only: [...]` (allowed provider set)                       | Pin via the model slug (`provider/model-id`), or constrain with `routing.provider.fallbacks`                                                                      |
  | `sort: 'cost'`                                             | `model: "auto"` with `routing.model.sort: "cost"`                                                                                                                 |
  | `sort: 'ttft'` (time to first token)                       | `model: "auto"` with `routing.model.sort: "latency"`                                                                                                              |
  | `sort: 'tps'` (throughput)                                 | `model: "auto"` with `routing.model.sort: "performance"`                                                                                                          |
  | `models: [...]` (model-level fallback chain)               | `routing.model.fallbacks` (ordered)                                                                                                                               |
  | `byok: { provider: [{...}] }` (request-scoped BYOK)        | Dashboard-level [BYOK](/docs/api-reference/endpoint/byok), not a request param. Store the key once and routing uses it automatically                                   |
  | `providerTimeouts: {...}` (per-provider failover timeouts) | Automatic failover on any provider error across your fallback chain, plus the 90% per-feature uptime gate                                                         |
  | `caching: 'auto'` (auto cache breakpoints)                 | Provider-native [prompt caching](/docs/api-reference/endpoint/prompt-caching) on Anthropic + AWS Bedrock. Manual `cache_control: { type: 'ephemeral' }` is honored too |
  | `zeroDataRetention: true`                                  | Key-level [Zero Data Retention](/docs/api-reference/endpoint/zero-data-retention), not a request param                                                                 |
  | `disallowPromptTraining: true`                             | Covered by ZDR-certified provider routing. Configure at the key level                                                                                             |
  | `serviceTier: 'flex' \| 'priority'`                        | No equivalent today. Concentrate routes for uptime and latency automatically                                                                                      |
  | `reasoning: { effort, max_tokens, ... }`                   | Pass reasoning controls in the standard request body. The [Responses API](/docs/api-reference/endpoint/create-response) normalizes reasoning across providers          |
</Accordion>

<Warning>
  Concentrate has conditional routing, but it conditions on **request capabilities** (feature support, ZDR flag, per-feature uptime, cache affinity), not on a per-request provider allow-list or sort key handed in the body. If your code relied on `only`/`order`/`sort` to steer specific requests, express the durable cases as `routing.*` body params or pin the model slug.
</Warning>

## Step 5: Update Model Identifiers

Concentrate accepts model strings in two forms:

* **Bare slug**, e.g. `gpt-5.5`, `claude-haiku-4-5`, `auto`. Routing picks a provider.
* **`provider/model-id`**, e.g. `bedrock/claude-haiku-4-5`, `openai/gpt-5.5`. Pins the request to a specific provider.

Vercel always uses the `provider/model` form (e.g. `anthropic/claude-opus-4.7`, `openai/gpt-5.5`, `xai/grok-4.3`), so most strings carry over directly once you reconcile version suffixes against [`GET /v1/models`](/docs/api-reference/endpoint/list-models).

One thing to know about the slashed form: **the prefix is the provider that serves the request, not the model's author.** For most popular names the two are the same string (`openai`, `anthropic`, `mistral`, `cohere`). They diverge whenever a model is hosted by something other than its author:

| Author                                 | Provider serving the request | Concentrate slug              |
| -------------------------------------- | ---------------------------- | ----------------------------- |
| Anthropic (`claude-haiku-4-5`)         | Anthropic                    | `anthropic/claude-haiku-4-5`  |
| Anthropic (same model, different host) | AWS Bedrock                  | `bedrock/claude-haiku-4-5`    |
| Anthropic (same model, different host) | Azure                        | `azure/claude-haiku-4-5`      |
| Google (`gemini-3.5-flash`)            | Google AI Studio             | `ai-studio/gemini-3.5-flash`  |
| Meta (`llama-3-8b-instruct`)           | AWS Bedrock                  | `bedrock/llama-3-8b-instruct` |

Bare slugs work in all of these cases. Use them when you don't care which provider serves the request. Use the `provider/` prefix when you specifically want to pin to one host (for ZDR compliance, contractual reasons, or latency in a specific region).

The only universally required slug change is auto-routing:

| Vercel AI Gateway                                              | Concentrate AI                                                                                                                  |
| -------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- |
| `sort: 'cost' \| 'ttft' \| 'tps'` in `providerOptions.gateway` | `model: "auto"` with explicit [`routing.model.sort`](/docs/api-reference/endpoint/auto-routing) (`cost` / `latency` / `performance`) |

For the authoritative list of supported `provider/model-id` pairs, call [`GET /v1/models`](/docs/api-reference/endpoint/list-models) or browse the [Model Fortress](https://concentrate.ai/models).

## Step 6: Reconnect Observability

Concentrate's dashboard covers the major surfaces you used in the AI Gateway dashboard.

| Vercel AI Gateway surface                            | Concentrate equivalent                                                                                                                               |
| ---------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- |
| Request logs (every routing decision, cost, outcome) | Per-request logs at [concentrate.ai](https://concentrate.ai)                                                                                         |
| Spend monitoring / budgets                           | Org / team / developer / key spend rollups and per-key spend limits                                                                                  |
| App attribution (`http-referer` / `x-title`)         | No per-request attribution. Roll up by key/team/org                                                                                                  |
| Routing metadata (`providerMetadata.gateway`)        | Resolved provider recorded per request in the dashboard                                                                                              |
| Observability traces (Vercel Observability → AI)     | Per-request logs; `previous_response_id` on the [Responses API](/docs/api-reference/endpoint/create-response) links related requests into a stateful tree |
| BYOK (\$0 markup)                                    | Free [BYOK](/docs/api-reference/endpoint/byok), managed in the dashboard. Store a provider key once and routing uses it automatically on every request    |

### Exporting your AI Gateway history

Vercel's dashboards do not import into Concentrate, and the reverse is also true. Historical request logs stay where they were created. If your migration is driven by compliance or audit requirements, export your history from the Vercel dashboard before deprovisioning.

## Step 7 (Optional): Adopt the Responses API

If you used Vercel's OpenAI Responses surface (or the native AI SDK), Concentrate's native [Responses API](/docs/api-reference/endpoint/create-response) is the direct successor: it supports streaming, tool calling, structured output, multi-modal input, and web search through a single normalized shape across every provider, and `previous_response_id` links related requests into a server-managed conversation tree.

<CodeGroup>
  ```bash cURL theme={null}
  curl https://api.concentrate.ai/v1/responses \
    -H "Content-Type: application/json" \
    -H "Authorization: Bearer $CONCENTRATE_API_KEY" \
    -d '{
      "model": "anthropic/claude-opus-4-6",
      "input": "What is the capital of France?"
    }'
  ```

  ```python Python theme={null}
  import os
  import requests

  response = requests.post(
      "https://api.concentrate.ai/v1/responses",
      headers={
          "Authorization": f"Bearer {os.environ['CONCENTRATE_API_KEY']}",
          "Content-Type": "application/json",
      },
      json={
          "model": "anthropic/claude-opus-4-6",
          "input": "What is the capital of France?",
      },
  )
  print(response.json())
  ```

  ```javascript JavaScript theme={null}
  const response = await fetch("https://api.concentrate.ai/v1/responses", {
    method: "POST",
    headers: {
      "Authorization": `Bearer ${process.env.CONCENTRATE_API_KEY}`,
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      model: "anthropic/claude-opus-4-6",
      input: "What is the capital of France?",
    }),
  });
  console.log(await response.json());
  ```
</CodeGroup>

## Why migrate to Concentrate

<AccordionGroup>
  <Accordion title="How it works" icon="circle-info">
    AI Gateway exposes three request schemas across two base URLs, plus a native AI SDK provider. Migrating collapses all of them onto Concentrate's single base URL `https://api.concentrate.ai/v1`.

    | Vercel surface                    | Vercel base URL                                     |
    | --------------------------------- | --------------------------------------------------- |
    | OpenAI Chat Completions           | `https://ai-gateway.vercel.sh/v1`                   |
    | OpenAI Responses                  | `https://ai-gateway.vercel.sh/v1`                   |
    | Anthropic Messages                | `https://ai-gateway.vercel.sh` (no `/v1`)           |
    | Native AI SDK (`@ai-sdk/gateway`) | resolved automatically from a plain string model id |

    Concentrate's [Responses API](/docs/api-reference/endpoint/create-response) is the closest one-to-one target for Vercel's Responses surface and the native AI SDK, reachable from the standard OpenAI SDK or any HTTP client.
  </Accordion>

  <Accordion title="Team-scale spend management" icon="building">
    Concentrate organizes billing around an **organization → team → developer → key** hierarchy. Set budgets at any level and roll spend up into a single dashboard. Per-team budgets and per-developer attribution come from the key itself, so there's no per-request `http-referer` / `x-title` attribution to maintain.
  </Accordion>

  <Accordion title="Feature-aware resiliency" icon="shield-check">
    Beyond ordered model and provider fallbacks (`routing.model.fallbacks`, `routing.provider.fallbacks`), Concentrate's routing layer ships:

    * **Uptime gate.** Providers whose per-feature success rate drops below 90% are skipped.
    * **Feature degradation.** If no provider supports the full requested feature set (e.g. `json_schema`), the request is downgraded to `json_object` or text instead of failing.
    * **Cache-affinity routing.** When multiple providers can serve a request, the one where your actor already has cached tokens is preferred.

    All on by default. No `providerOptions.gateway` block to author per request.
  </Accordion>

  <Accordion title="Strategy-driven auto routing" icon="route">
    `model: "auto"` accepts an explicit optimization target via `routing.model.sort`: `cost`, `latency`, or `performance` (default). See [Auto Routing](/docs/api-reference/endpoint/auto-routing). This maps cleanly onto Vercel's `sort` metrics (`cost` / `ttft` / `tps`).
  </Accordion>

  <Accordion title="Native Responses and Messages APIs" icon="code">
    Like AI Gateway's Responses and Anthropic surfaces, Concentrate exposes a first-class [Responses API](/docs/api-reference/endpoint/create-response) and an Anthropic-compatible [Messages API](/docs/api-reference/endpoint/create-message), both on the same `…/v1` base, with no per-surface base-URL difference.
  </Accordion>

  <Accordion title="Managed provider credentials by default" icon="key">
    Concentrate manages provider credentials by default — point at a model and Concentrate owns the upstream credentials. And if you want to keep using your own provider keys, [BYOK](/docs/api-reference/endpoint/byok) is free and simpler than AI Gateway's: store the key once in the dashboard instead of passing `byok` config per request.
  </Accordion>
</AccordionGroup>

## Troubleshooting

<AccordionGroup>
  <Accordion title="Model not found" icon="circle-question">
    Bare slugs (`gpt-5.5`, `claude-haiku-4-5`) and `provider/model-id` slugs both work. If you're using a `provider/` prefix and getting a miss, double-check the prefix is a provider (e.g. `bedrock`, `azure`, `ai-studio`) and not just the author (e.g. `meta`, `google`), and reconcile the version suffix against [`GET /v1/models`](/docs/api-reference/endpoint/list-models).
  </Accordion>

  <Accordion title="Invalid API key error" icon="triangle-exclamation">
    Concentrate keys start with `sk-cn-v1-`. If you are still sending a Vercel `vck_...` key (or a `VERCEL_OIDC_TOKEN`) as the `Authorization` bearer, you will see a 401. Verify the value in your [dashboard](https://concentrate.ai) and confirm there are no extra spaces or quotes.
  </Accordion>

  <Accordion title="Requests succeed but nothing shows up in the Concentrate dashboard" icon="chart-line">
    Confirm the base URL is `https://api.concentrate.ai/v1`, not `ai-gateway.vercel.sh`. If the SDK is still pointed at Vercel it is logging against your AI Gateway dashboard, not Concentrate.
  </Accordion>

  <Accordion title="My Anthropic requests 404 after migrating" icon="folder">
    Vercel's Anthropic surface uses `https://ai-gateway.vercel.sh` with no `/v1`; Concentrate uses `https://api.concentrate.ai/v1` for every surface. If you copied the Vercel Anthropic base URL verbatim, you dropped the `/v1` segment. Set the base URL to `https://api.concentrate.ai/v1`.
  </Accordion>

  <Accordion title="My provider routing stopped applying" icon="route">
    `providerOptions.gateway` (`order`, `only`, `sort`, `models`, `providerTimeouts`) has no effect on Concentrate. Express fallbacks via `routing.model.fallbacks` / `routing.provider.fallbacks` body params, or use `model: "auto"` with a [routing strategy](/docs/api-reference/endpoint/auto-routing).
  </Accordion>

  <Accordion title="Cache hit rate dropped after migrating" icon="database">
    Concentrate uses provider-native prompt caching, currently supported on Anthropic and AWS Bedrock. There is no gateway-stored cache, so Vercel's `caching: 'auto'` auto-breakpoints become provider-native caching. Caches are seeded per API key by default; pass `prompt_cache_key` in the request body if you want to set the seed explicitly.
  </Accordion>

  <Accordion title="Connection errors" icon="wifi">
    Confirm the base URL is `https://api.concentrate.ai/v1` (no per-surface variant like the `/v1`-less Anthropic base). Test the connection manually:

    ```bash theme={null}
    curl https://api.concentrate.ai/v1/responses/health
    ```
  </Accordion>
</AccordionGroup>

## Next Steps

<CardGroup cols={2}>
  <Card title="API Reference" icon="code" href="/docs/api-reference/introduction">
    Explore the full API capabilities
  </Card>

  <Card title="Available Models" icon="layer-group" href="/docs/api-reference/endpoint/list-models">
    Browse all supported models
  </Card>

  <Card title="Auto Routing" icon="route" href="/docs/api-reference/endpoint/auto-routing">
    Optimize model selection automatically
  </Card>

  <Card title="Get Support" icon="life-ring" href="mailto:support@concentrate.ai">
    Contact our support team
  </Card>
</CardGroup>

## Feedback

If you hit anything that didn't translate cleanly (especially around `providerOptions.gateway`, BYOK, service tiers, app attribution, or the Anthropic base-URL difference), email [support@concentrate.ai](mailto:support@concentrate.ai). The capability gaps called out above are tracked, and migration friction reports directly shape what we ship next.
