{"slug":"supported-models-and-providers","title":"Supported models and providers","tags":["tailscale"],"agent_summary":"Last validated: Apr 9, 2026","trigger_phrases":[],"runnable":false,"markdown":"\r\n# Supported models and providers\r\n\r\nLast validated: Apr 9, 2026\r\n\r\nAperture by Tailscaleis currently [in alpha](https://tailscale.com/docs/reference/tailscale-release-stages#alpha).\r\n\r\nAperture routes LLM requests to multiple providers, each with different base URLs, authentication methods, and API formats. This page lists the supported providers, compatibility flags, authorization types, and pricing options.\r\n\r\nThis page is part of the [Aperture reference](https://tailscale.com/docs/aperture/reference) documentation. For field-level configuration details, refer to the [Aperture configuration reference](https://tailscale.com/docs/aperture/configuration). For step-by-step provider setup, refer to the [Set up LLM providers](https://tailscale.com/docs/aperture/set-up-providers) guides. To configure coding agents to connect through Aperture, refer to the [Set up LLM clients](https://tailscale.com/docs/aperture/use-your-tools) guides.\r\n\r\n## [Provider matrix](https://tailscale.com/docs/aperture/provider-compatibility\\#provider-matrix)\r\n\r\nThe following table summarizes how to configure each supported provider type:\r\n\r\n| Provider | Base URL | Authorization | Compatibility flags | `cost_basis` |\r\n| --- | --- | --- | --- | --- |\r\n| OpenAI | `https://api.openai.com/` | `bearer` | `openai_chat`, `openai_responses` | `openai` |\r\n| Anthropic | `https://api.anthropic.com` | `x-api-key` | `anthropic_messages` | `anthropic` |\r\n| Google Gemini | `https://generativelanguage.googleapis.com` | `x-goog-api-key` | `gemini_generate_content` | `google` |\r\n| Vertex AI (Gemini) | `https://aiplatform.googleapis.com` | `bearer` | `google_generate_content` | `vertex` |\r\n| Vertex AI (Anthropic) | `https://aiplatform.googleapis.com` | `bearer` | `google_raw_predict` | `vertex` |\r\n| Vertex AI Express | `https://aiplatform.googleapis.com` | `x-goog-api-key` | `google_generate_content` | `vertex` |\r\n| Amazon Bedrock | `https://bedrock-runtime.<region>.amazonaws.com` | `bearer` | `bedrock_model_invoke` | `bedrock` |\r\n| OpenRouter | `https://openrouter.ai/api/` | `bearer` | `openai_chat` (default) | `openrouter` |\r\n| Self-hosted | Your server URL | `bearer` (default) | `openai_chat` (default) | N/A |\r\n\r\n## [Compatibility flags](https://tailscale.com/docs/aperture/provider-compatibility\\#compatibility-flags)\r\n\r\nThe `compatibility` object in a provider configuration specifies which API formats the provider supports. These flags determine which endpoints Aperture exposes for the provider's models.\r\n\r\n| Flag | Type | Default | Description |\r\n| --- | --- | --- | --- |\r\n| `openai_chat` | boolean | `true` | Supports `/v1/chat/completions` |\r\n| `openai_responses` | boolean | `false` | Supports `/v1/responses` |\r\n| `anthropic_messages` | boolean | `false` | Supports `/v1/messages` |\r\n| `gemini_generate_content` | boolean | `false` | Supports Gemini API format |\r\n| `bedrock_model_invoke` | boolean | `false` | Supports Amazon Bedrock format |\r\n| `google_generate_content` | boolean | `false` | Supports Vertex AI Gemini format |\r\n| `google_raw_predict` | boolean | `false` | Supports Vertex AI raw predict for Anthropic models |\r\n| `bedrock_converse` | boolean | `false` | Supports Amazon Bedrock Converse API format |\r\n| `experimental_gemini_cli_vertex_compat` | boolean | `false` | Gemini CLI short-form Vertex path rewriting |\r\n\r\nEnable the flags that match the API formats your provider supports. For providers that serve models from multiple vendors (such as Vertex AI with both Gemini and Anthropic models), enable multiple flags.\r\n\r\n## [Authorization types](https://tailscale.com/docs/aperture/provider-compatibility\\#authorization-types)\r\n\r\nDifferent providers require different authorization header formats. Set the `authorization` field on the provider to specify which format to use.\r\n\r\n| Value | Header format | Used by |\r\n| --- | --- | --- |\r\n| `bearer` | `Authorization: Bearer <key>` | OpenAI and most providers |\r\n| `x-api-key` | `x-api-key: <key>` | Anthropic |\r\n| `x-goog-api-key` | `x-goog-api-key: <key>` | Google Gemini, Vertex AI Express |\r\n\r\nThe `authorization` field is not required for all providers. For example, Vertex AI uses a service account key file instead of an API key (prefixed with `keyfile::`). Refer to [set up a Vertex AI provider](https://tailscale.com/docs/aperture/how-to/use-vertex-ai) for step-by-step configuration instructions. Vertex AI Express uses `x-goog-api-key` with a standard API key. Refer to [set up a Vertex AI Express provider](https://tailscale.com/docs/aperture/how-to/use-vertex-ai-express) for details.\r\n\r\n## [Cost basis](https://tailscale.com/docs/aperture/provider-compatibility\\#cost-basis)\r\n\r\nAperture estimates the dollar cost of every LLM request. Cost estimates power quotas, hook metadata, and the per-model pricing shown in the Aperture dashboard.\r\n\r\nAperture auto-infers pricing for known providers based on the provider's `compatibility` flags (for example, `anthropic_messages` maps to Anthropic pricing). For providers where auto-inference does not apply, you can set `cost_basis` explicitly on the provider.\r\n\r\nThe following `cost_basis` values are supported:\r\n\r\n- `anthropic`\r\n- `openai`\r\n- `google`\r\n- `bedrock`\r\n- `bedrock-us`\r\n- `bedrock-eu`\r\n- `vertex`\r\n- `azure`\r\n- `azure-eu`\r\n- `openrouter`\r\n- `vercel`\r\n\r\nTo disable auto-inference globally, set `auto_cost_basis` to `false` at the top level of the configuration. When disabled, only providers with an explicit `cost_basis` produce cost estimates.\r\n\r\n### [Model cost map](https://tailscale.com/docs/aperture/provider-compatibility\\#model-cost-map)\r\n\r\nWhen a model name does not appear in the pricing database (for example, after adding a new or custom model), you can use `model_cost_map` to map it to a known model for pricing purposes:\r\n\r\n```json\r\n\"anthropic\": {\r\n  \"cost_basis\": \"anthropic\",\r\n  \"model_cost_map\": [\\\r\n    // claude-opus-9-0 isn't in the pricing DB yet;\\\r\n    // price it like claude-opus-4-6\\\r\n    {\"match\": \"claude-opus-9-*\", \"as\": \"claude-opus-4-6\"},\\\r\n\\\r\n    // Preview models priced like sonnet\\\r\n    {\"match\": \"claude-*-preview*\", \"as\": \"claude-sonnet-4-5\",\\\r\n     \"adjustment\": 1.1},\\\r\n  ],\r\n}\r\n```\r\n\r\nEach entry supports the following fields:\r\n\r\n- `match`: Glob pattern against the model name (uses `path.Match` syntax).\r\n- `as`: Replacement model name for the pricing lookup.\r\n- `adjustment`: Price multiplier (optional, default `1.0`). Use `1.5` to mark up 50%.\r\n\r\nAperture uses the first matching entry.\r\n\r\n## [Provider examples](https://tailscale.com/docs/aperture/provider-compatibility\\#provider-examples)\r\n\r\nThe following examples show how to configure common providers.\r\n\r\n### [OpenAI](https://tailscale.com/docs/aperture/provider-compatibility\\#openai)\r\n\r\nConfigure OpenAI with the chat and responses APIs:\r\n\r\n```json\r\n{\r\n  \"providers\": {\r\n    \"openai\": {\r\n      \"baseurl\": \"https://api.openai.com/\",\r\n      \"apikey\": \"YOUR_OPENAI_KEY\",\r\n      \"models\": [\"gpt-5\", \"gpt-5-mini\", \"gpt-4.1\"],\r\n      \"name\": \"OpenAI\",\r\n      \"description\": \"OpenAI models\",\r\n      \"compatibility\": {\r\n        \"openai_chat\": true,\r\n        \"openai_responses\": true\r\n      }\r\n    }\r\n  }\r\n}\r\n```\r\n\r\n### [Anthropic](https://tailscale.com/docs/aperture/provider-compatibility\\#anthropic)\r\n\r\nConfigure Anthropic with the messages API and `x-api-key` authorization:\r\n\r\n```json\r\n{\r\n  \"providers\": {\r\n    \"anthropic\": {\r\n      \"baseurl\": \"https://api.anthropic.com\",\r\n      \"apikey\": \"YOUR_ANTHROPIC_KEY\",\r\n      \"authorization\": \"x-api-key\",\r\n      \"models\": [\"claude-sonnet-4-5\", \"claude-haiku-4-5\", \"claude-opus-4-5\"],\r\n      \"compatibility\": {\r\n        \"openai_chat\": false,\r\n        \"anthropic_messages\": true\r\n      }\r\n    }\r\n  }\r\n}\r\n```\r\n\r\n### [Google Gemini](https://tailscale.com/docs/aperture/provider-compatibility\\#google-gemini)\r\n\r\nConfigure Google Gemini with the Gemini API and `x-goog-api-key` authorization:\r\n\r\n```json\r\n{\r\n  \"providers\": {\r\n    \"gemini\": {\r\n      \"baseurl\": \"https://generativelanguage.googleapis.com\",\r\n      \"apikey\": \"YOUR_GEMINI_KEY\",\r\n      \"authorization\": \"x-goog-api-key\",\r\n      \"models\": [\"gemini-2.5-flash\", \"gemini-2.5-pro\"],\r\n      \"name\": \"Google Gemini\",\r\n      \"compatibility\": {\r\n        \"openai_chat\": false,\r\n        \"gemini_generate_content\": true\r\n      }\r\n    }\r\n  }\r\n}\r\n```\r\n\r\n### [Vertex AI](https://tailscale.com/docs/aperture/provider-compatibility\\#vertex-ai)\r\n\r\nConfigure Google Vertex AI with support for both Gemini models and Anthropic models with raw predict:\r\n\r\n```json\r\n{\r\n  \"providers\": {\r\n    \"vertex\": {\r\n      \"baseurl\": \"https://aiplatform.googleapis.com\",\r\n      \"authorization\": \"bearer\",\r\n      \"apikey\": \"keyfile::ba3..3kb.data...67\",\r\n      \"models\": [\\\r\n        \"gemini-2.0-flash-exp\",\\\r\n        \"gemini-2.5-flash\",\\\r\n        \"gemini-2.5-flash-image\",\\\r\n        \"gemini-2.5-pro\",\\\r\n        \"claude-opus-4-5@20251101\",\\\r\n        \"claude-haiku-4-5@20251001\",\\\r\n        \"claude-sonnet-4-5@20250929\",\\\r\n        \"claude-opus-4-6\"\\\r\n      ],\r\n      \"compatibility\": {\r\n        // Gemini model support\r\n        \"google_generate_content\": true,\r\n        // Anthropic via Vertex model support\r\n        \"google_raw_predict\": true\r\n      }\r\n    }\r\n  }\r\n}\r\n```\r\n\r\nFor step-by-step setup including GCP service account creation and key file generation, refer to [set up a Vertex AI provider](https://tailscale.com/docs/aperture/how-to/use-vertex-ai). For a simpler setup using API key authentication (Gemini models only), refer to [set up a Vertex AI Express provider](https://tailscale.com/docs/aperture/how-to/use-vertex-ai-express).\r\n\r\n### [Amazon Bedrock](https://tailscale.com/docs/aperture/provider-compatibility\\#amazon-bedrock)\r\n\r\nConfigure Amazon Bedrock with the Bedrock model invocation API:\r\n\r\n```json\r\n{\r\n  \"providers\": {\r\n    \"bedrock\": {\r\n      \"baseurl\": \"https://bedrock-runtime.us-east-1.amazonaws.com\",\r\n      \"apikey\": \"bedrock-api-key-xxx\",\r\n      \"authorization\": \"bearer\",\r\n      \"models\": [\\\r\n        \"us.anthropic.claude-haiku-4-5-20251001-v1:0\",\\\r\n        \"us.anthropic.claude-sonnet-4-5-20250929-v1:0\",\\\r\n        \"us.anthropic.claude-opus-4-5-20251101-v1:0\",\\\r\n        \"us.anthropic.claude-opus-4-6-v1\"\\\r\n      ],\r\n      \"compatibility\": {\r\n        \"bedrock_model_invoke\": true\r\n      }\r\n    }\r\n  }\r\n}\r\n```\r\n\r\n### [OpenRouter](https://tailscale.com/docs/aperture/provider-compatibility\\#openrouter)\r\n\r\nConfigure OpenRouter as a multi-provider aggregator:\r\n\r\n```json\r\n{\r\n  \"providers\": {\r\n    \"openrouter\": {\r\n      \"baseurl\": \"https://openrouter.ai/api/\",\r\n      \"apikey\": \"YOUR_OPENROUTER_KEY\",\r\n      \"models\": [\\\r\n        \"qwen/qwen3-235b-a22b-2507\",\\\r\n        \"google/gemini-2.5-pro-preview\",\\\r\n        \"x-ai/grok-code-fast-1\"\\\r\n      ]\r\n    }\r\n  }\r\n}\r\n```\r\n\r\n### [Self-hosted](https://tailscale.com/docs/aperture/provider-compatibility\\#self-hosted)\r\n\r\nConfigure a self-hosted LLM server accessible from the tailnet:\r\n\r\n```json\r\n{\r\n  \"providers\": {\r\n    \"private\": {\r\n      \"baseurl\": \"YOUR_PRIVATE_LLM_URL\",\r\n      \"models\": [\"qwen3-coder-30b\", \"llama-3.1-70b\"]\r\n    }\r\n  }\r\n}\r\n```\r\n\r\nSelf-hosted providers use `openai_chat` compatibility by default. If your server exposes a different API format, set the appropriate compatibility flags.\r\n\r\n![Project Logo](https://cdn.brandfetch.io/tailscale.com/fallback/lettermark/theme/dark/h/256/w/256/icon?c=1bfwsmEH20zzEfSNTed)\r\n\r\nAsk AI\r\n\r\nreCAPTCHA\r\n\r\nRecaptcha requires verification.\r\n\r\nprotected by **reCAPTCHA**\r\n","html":"<h1>Supported models and providers</h1>\n<p>Last validated: Apr 9, 2026</p>\n<p>Aperture by Tailscaleis currently <a href=\"https://tailscale.com/docs/reference/tailscale-release-stages#alpha\">in alpha</a>.</p>\n<p>Aperture routes LLM requests to multiple providers, each with different base URLs, authentication methods, and API formats. This page lists the supported providers, compatibility flags, authorization types, and pricing options.</p>\n<p>This page is part of the <a href=\"https://tailscale.com/docs/aperture/reference\">Aperture reference</a> documentation. For field-level configuration details, refer to the <a href=\"https://tailscale.com/docs/aperture/configuration\">Aperture configuration reference</a>. For step-by-step provider setup, refer to the <a href=\"https://tailscale.com/docs/aperture/set-up-providers\">Set up LLM providers</a> guides. To configure coding agents to connect through Aperture, refer to the <a href=\"https://tailscale.com/docs/aperture/use-your-tools\">Set up LLM clients</a> guides.</p>\n<h2><a href=\"https://tailscale.com/docs/aperture/provider-compatibility#provider-matrix\">Provider matrix</a></h2>\n<p>The following table summarizes how to configure each supported provider type:</p>\n<p>| Provider | Base URL | Authorization | Compatibility flags | <code>cost_basis</code> |\r\n| --- | --- | --- | --- | --- |\r\n| OpenAI | <code>https://api.openai.com/</code> | <code>bearer</code> | <code>openai_chat</code>, <code>openai_responses</code> | <code>openai</code> |\r\n| Anthropic | <code>https://api.anthropic.com</code> | <code>x-api-key</code> | <code>anthropic_messages</code> | <code>anthropic</code> |\r\n| Google Gemini | <code>https://generativelanguage.googleapis.com</code> | <code>x-goog-api-key</code> | <code>gemini_generate_content</code> | <code>google</code> |\r\n| Vertex AI (Gemini) | <code>https://aiplatform.googleapis.com</code> | <code>bearer</code> | <code>google_generate_content</code> | <code>vertex</code> |\r\n| Vertex AI (Anthropic) | <code>https://aiplatform.googleapis.com</code> | <code>bearer</code> | <code>google_raw_predict</code> | <code>vertex</code> |\r\n| Vertex AI Express | <code>https://aiplatform.googleapis.com</code> | <code>x-goog-api-key</code> | <code>google_generate_content</code> | <code>vertex</code> |\r\n| Amazon Bedrock | <code>https://bedrock-runtime.&#x3C;region>.amazonaws.com</code> | <code>bearer</code> | <code>bedrock_model_invoke</code> | <code>bedrock</code> |\r\n| OpenRouter | <code>https://openrouter.ai/api/</code> | <code>bearer</code> | <code>openai_chat</code> (default) | <code>openrouter</code> |\r\n| Self-hosted | Your server URL | <code>bearer</code> (default) | <code>openai_chat</code> (default) | N/A |</p>\n<h2><a href=\"https://tailscale.com/docs/aperture/provider-compatibility#compatibility-flags\">Compatibility flags</a></h2>\n<p>The <code>compatibility</code> object in a provider configuration specifies which API formats the provider supports. These flags determine which endpoints Aperture exposes for the provider's models.</p>\n<p>| Flag | Type | Default | Description |\r\n| --- | --- | --- | --- |\r\n| <code>openai_chat</code> | boolean | <code>true</code> | Supports <code>/v1/chat/completions</code> |\r\n| <code>openai_responses</code> | boolean | <code>false</code> | Supports <code>/v1/responses</code> |\r\n| <code>anthropic_messages</code> | boolean | <code>false</code> | Supports <code>/v1/messages</code> |\r\n| <code>gemini_generate_content</code> | boolean | <code>false</code> | Supports Gemini API format |\r\n| <code>bedrock_model_invoke</code> | boolean | <code>false</code> | Supports Amazon Bedrock format |\r\n| <code>google_generate_content</code> | boolean | <code>false</code> | Supports Vertex AI Gemini format |\r\n| <code>google_raw_predict</code> | boolean | <code>false</code> | Supports Vertex AI raw predict for Anthropic models |\r\n| <code>bedrock_converse</code> | boolean | <code>false</code> | Supports Amazon Bedrock Converse API format |\r\n| <code>experimental_gemini_cli_vertex_compat</code> | boolean | <code>false</code> | Gemini CLI short-form Vertex path rewriting |</p>\n<p>Enable the flags that match the API formats your provider supports. For providers that serve models from multiple vendors (such as Vertex AI with both Gemini and Anthropic models), enable multiple flags.</p>\n<h2><a href=\"https://tailscale.com/docs/aperture/provider-compatibility#authorization-types\">Authorization types</a></h2>\n<p>Different providers require different authorization header formats. Set the <code>authorization</code> field on the provider to specify which format to use.</p>\n<p>| Value | Header format | Used by |\r\n| --- | --- | --- |\r\n| <code>bearer</code> | <code>Authorization: Bearer &#x3C;key></code> | OpenAI and most providers |\r\n| <code>x-api-key</code> | <code>x-api-key: &#x3C;key></code> | Anthropic |\r\n| <code>x-goog-api-key</code> | <code>x-goog-api-key: &#x3C;key></code> | Google Gemini, Vertex AI Express |</p>\n<p>The <code>authorization</code> field is not required for all providers. For example, Vertex AI uses a service account key file instead of an API key (prefixed with <code>keyfile::</code>). Refer to <a href=\"https://tailscale.com/docs/aperture/how-to/use-vertex-ai\">set up a Vertex AI provider</a> for step-by-step configuration instructions. Vertex AI Express uses <code>x-goog-api-key</code> with a standard API key. Refer to <a href=\"https://tailscale.com/docs/aperture/how-to/use-vertex-ai-express\">set up a Vertex AI Express provider</a> for details.</p>\n<h2><a href=\"https://tailscale.com/docs/aperture/provider-compatibility#cost-basis\">Cost basis</a></h2>\n<p>Aperture estimates the dollar cost of every LLM request. Cost estimates power quotas, hook metadata, and the per-model pricing shown in the Aperture dashboard.</p>\n<p>Aperture auto-infers pricing for known providers based on the provider's <code>compatibility</code> flags (for example, <code>anthropic_messages</code> maps to Anthropic pricing). For providers where auto-inference does not apply, you can set <code>cost_basis</code> explicitly on the provider.</p>\n<p>The following <code>cost_basis</code> values are supported:</p>\n<ul>\n<li><code>anthropic</code></li>\n<li><code>openai</code></li>\n<li><code>google</code></li>\n<li><code>bedrock</code></li>\n<li><code>bedrock-us</code></li>\n<li><code>bedrock-eu</code></li>\n<li><code>vertex</code></li>\n<li><code>azure</code></li>\n<li><code>azure-eu</code></li>\n<li><code>openrouter</code></li>\n<li><code>vercel</code></li>\n</ul>\n<p>To disable auto-inference globally, set <code>auto_cost_basis</code> to <code>false</code> at the top level of the configuration. When disabled, only providers with an explicit <code>cost_basis</code> produce cost estimates.</p>\n<h3><a href=\"https://tailscale.com/docs/aperture/provider-compatibility#model-cost-map\">Model cost map</a></h3>\n<p>When a model name does not appear in the pricing database (for example, after adding a new or custom model), you can use <code>model_cost_map</code> to map it to a known model for pricing purposes:</p>\n<pre><code class=\"language-json\">\"anthropic\": {\r\n  \"cost_basis\": \"anthropic\",\r\n  \"model_cost_map\": [\\\r\n    // claude-opus-9-0 isn't in the pricing DB yet;\\\r\n    // price it like claude-opus-4-6\\\r\n    {\"match\": \"claude-opus-9-*\", \"as\": \"claude-opus-4-6\"},\\\r\n\\\r\n    // Preview models priced like sonnet\\\r\n    {\"match\": \"claude-*-preview*\", \"as\": \"claude-sonnet-4-5\",\\\r\n     \"adjustment\": 1.1},\\\r\n  ],\r\n}\n</code></pre>\n<p>Each entry supports the following fields:</p>\n<ul>\n<li><code>match</code>: Glob pattern against the model name (uses <code>path.Match</code> syntax).</li>\n<li><code>as</code>: Replacement model name for the pricing lookup.</li>\n<li><code>adjustment</code>: Price multiplier (optional, default <code>1.0</code>). Use <code>1.5</code> to mark up 50%.</li>\n</ul>\n<p>Aperture uses the first matching entry.</p>\n<h2><a href=\"https://tailscale.com/docs/aperture/provider-compatibility#provider-examples\">Provider examples</a></h2>\n<p>The following examples show how to configure common providers.</p>\n<h3><a href=\"https://tailscale.com/docs/aperture/provider-compatibility#openai\">OpenAI</a></h3>\n<p>Configure OpenAI with the chat and responses APIs:</p>\n<pre><code class=\"language-json\">{\r\n  \"providers\": {\r\n    \"openai\": {\r\n      \"baseurl\": \"https://api.openai.com/\",\r\n      \"apikey\": \"YOUR_OPENAI_KEY\",\r\n      \"models\": [\"gpt-5\", \"gpt-5-mini\", \"gpt-4.1\"],\r\n      \"name\": \"OpenAI\",\r\n      \"description\": \"OpenAI models\",\r\n      \"compatibility\": {\r\n        \"openai_chat\": true,\r\n        \"openai_responses\": true\r\n      }\r\n    }\r\n  }\r\n}\n</code></pre>\n<h3><a href=\"https://tailscale.com/docs/aperture/provider-compatibility#anthropic\">Anthropic</a></h3>\n<p>Configure Anthropic with the messages API and <code>x-api-key</code> authorization:</p>\n<pre><code class=\"language-json\">{\r\n  \"providers\": {\r\n    \"anthropic\": {\r\n      \"baseurl\": \"https://api.anthropic.com\",\r\n      \"apikey\": \"YOUR_ANTHROPIC_KEY\",\r\n      \"authorization\": \"x-api-key\",\r\n      \"models\": [\"claude-sonnet-4-5\", \"claude-haiku-4-5\", \"claude-opus-4-5\"],\r\n      \"compatibility\": {\r\n        \"openai_chat\": false,\r\n        \"anthropic_messages\": true\r\n      }\r\n    }\r\n  }\r\n}\n</code></pre>\n<h3><a href=\"https://tailscale.com/docs/aperture/provider-compatibility#google-gemini\">Google Gemini</a></h3>\n<p>Configure Google Gemini with the Gemini API and <code>x-goog-api-key</code> authorization:</p>\n<pre><code class=\"language-json\">{\r\n  \"providers\": {\r\n    \"gemini\": {\r\n      \"baseurl\": \"https://generativelanguage.googleapis.com\",\r\n      \"apikey\": \"YOUR_GEMINI_KEY\",\r\n      \"authorization\": \"x-goog-api-key\",\r\n      \"models\": [\"gemini-2.5-flash\", \"gemini-2.5-pro\"],\r\n      \"name\": \"Google Gemini\",\r\n      \"compatibility\": {\r\n        \"openai_chat\": false,\r\n        \"gemini_generate_content\": true\r\n      }\r\n    }\r\n  }\r\n}\n</code></pre>\n<h3><a href=\"https://tailscale.com/docs/aperture/provider-compatibility#vertex-ai\">Vertex AI</a></h3>\n<p>Configure Google Vertex AI with support for both Gemini models and Anthropic models with raw predict:</p>\n<pre><code class=\"language-json\">{\r\n  \"providers\": {\r\n    \"vertex\": {\r\n      \"baseurl\": \"https://aiplatform.googleapis.com\",\r\n      \"authorization\": \"bearer\",\r\n      \"apikey\": \"keyfile::ba3..3kb.data...67\",\r\n      \"models\": [\\\r\n        \"gemini-2.0-flash-exp\",\\\r\n        \"gemini-2.5-flash\",\\\r\n        \"gemini-2.5-flash-image\",\\\r\n        \"gemini-2.5-pro\",\\\r\n        \"claude-opus-4-5@20251101\",\\\r\n        \"claude-haiku-4-5@20251001\",\\\r\n        \"claude-sonnet-4-5@20250929\",\\\r\n        \"claude-opus-4-6\"\\\r\n      ],\r\n      \"compatibility\": {\r\n        // Gemini model support\r\n        \"google_generate_content\": true,\r\n        // Anthropic via Vertex model support\r\n        \"google_raw_predict\": true\r\n      }\r\n    }\r\n  }\r\n}\n</code></pre>\n<p>For step-by-step setup including GCP service account creation and key file generation, refer to <a href=\"https://tailscale.com/docs/aperture/how-to/use-vertex-ai\">set up a Vertex AI provider</a>. For a simpler setup using API key authentication (Gemini models only), refer to <a href=\"https://tailscale.com/docs/aperture/how-to/use-vertex-ai-express\">set up a Vertex AI Express provider</a>.</p>\n<h3><a href=\"https://tailscale.com/docs/aperture/provider-compatibility#amazon-bedrock\">Amazon Bedrock</a></h3>\n<p>Configure Amazon Bedrock with the Bedrock model invocation API:</p>\n<pre><code class=\"language-json\">{\r\n  \"providers\": {\r\n    \"bedrock\": {\r\n      \"baseurl\": \"https://bedrock-runtime.us-east-1.amazonaws.com\",\r\n      \"apikey\": \"bedrock-api-key-xxx\",\r\n      \"authorization\": \"bearer\",\r\n      \"models\": [\\\r\n        \"us.anthropic.claude-haiku-4-5-20251001-v1:0\",\\\r\n        \"us.anthropic.claude-sonnet-4-5-20250929-v1:0\",\\\r\n        \"us.anthropic.claude-opus-4-5-20251101-v1:0\",\\\r\n        \"us.anthropic.claude-opus-4-6-v1\"\\\r\n      ],\r\n      \"compatibility\": {\r\n        \"bedrock_model_invoke\": true\r\n      }\r\n    }\r\n  }\r\n}\n</code></pre>\n<h3><a href=\"https://tailscale.com/docs/aperture/provider-compatibility#openrouter\">OpenRouter</a></h3>\n<p>Configure OpenRouter as a multi-provider aggregator:</p>\n<pre><code class=\"language-json\">{\r\n  \"providers\": {\r\n    \"openrouter\": {\r\n      \"baseurl\": \"https://openrouter.ai/api/\",\r\n      \"apikey\": \"YOUR_OPENROUTER_KEY\",\r\n      \"models\": [\\\r\n        \"qwen/qwen3-235b-a22b-2507\",\\\r\n        \"google/gemini-2.5-pro-preview\",\\\r\n        \"x-ai/grok-code-fast-1\"\\\r\n      ]\r\n    }\r\n  }\r\n}\n</code></pre>\n<h3><a href=\"https://tailscale.com/docs/aperture/provider-compatibility#self-hosted\">Self-hosted</a></h3>\n<p>Configure a self-hosted LLM server accessible from the tailnet:</p>\n<pre><code class=\"language-json\">{\r\n  \"providers\": {\r\n    \"private\": {\r\n      \"baseurl\": \"YOUR_PRIVATE_LLM_URL\",\r\n      \"models\": [\"qwen3-coder-30b\", \"llama-3.1-70b\"]\r\n    }\r\n  }\r\n}\n</code></pre>\n<p>Self-hosted providers use <code>openai_chat</code> compatibility by default. If your server exposes a different API format, set the appropriate compatibility flags.</p>\n<p><img src=\"https://cdn.brandfetch.io/tailscale.com/fallback/lettermark/theme/dark/h/256/w/256/icon?c=1bfwsmEH20zzEfSNTed\" alt=\"Project Logo\"></p>\n<p>Ask AI</p>\n<p>reCAPTCHA</p>\n<p>Recaptcha requires verification.</p>\n<p>protected by <strong>reCAPTCHA</strong></p>\n"}