There's No Kimi Button: Custom Providers on Pangolin's New AI Gateway Source
Markdown source•
1---2title: "There's No Kimi Button: Custom Providers on Pangolin's New AI Gateway"3date: "2026-08-30"4published: true5tags: ["pangolin", "ai-gateway", "kimi", "deepseek", "ai", "self-hosted", "zero-trust"]6author: "Gavin Jackson"7excerpt: "Pangolin 1.22 shipped an AI Gateway this week. The provider list covers OpenAI, Anthropic and Gemini, but there's no Kimi or DeepSeek button. Here's how to register both as custom providers, and why the missing buttons turn out not to matter."8---910# There's No Kimi Button: Custom Providers on Pangolin's New AI Gateway1112<p align="center"><img src="/assets/pangolin/cyber-pangolin-hero.jpg" alt="Cyber-pangolin emblem glowing over a neon wireframe grid in cyan and magenta" width="800"></p>1314Pangolin 1.22 landed this week, and the headline feature is the **AI Gateway**: an identity-aware proxy that sits in front of cloud AI APIs (OpenAI, Anthropic, Gemini and friends) and self-hosted model servers (Ollama, vLLM and friends), so coding agents and AI clients call a Pangolin URL instead of calling the vendor directly. The release also unlocks browser-based SSH, RDP and VNC for Community Edition, which is a decent bonus on top.1516I've been running Pangolin on a personal Enterprise licence since my [evaluation earlier this year](/post/pangolin-zero-trust-production-evaluation), so the update was quick and a new **AI Gateway** section appeared in the sidebar. I had some leftover API credit with Moonshot - Kimi K3, which regular readers will know [powers Bob](/post/bob-got-an-update-kimi-k3) - and with DeepSeek. The obvious weekend test: wire both into the gateway and see what the experience looks like for an end user.1718Then I opened the provider creation screen and found there is no Kimi option. No DeepSeek option either.1920## What the AI Gateway actually is2122Short version: an AI Gateway resource works like the HTTPS resources Pangolin already had. It gets a domain, sits behind the reverse proxy, and uses the same users, roles and identity. The difference is what it proxies. Instead of forwarding browser traffic to an internal app, it speaks the API formats of the providers you attach - Chat Completions, Anthropic Messages, Gemini's generateContent and so on - and forwards each request to the matching upstream with the real vendor key.2324The interesting consequences:2526- **The real API key never leaves Pangolin.** Clients authenticate to the gateway with virtual API keys on a public resource, or with the Pangolin client session itself on a private resource, which is keyless.27- **Budgets sit in front of every call.** Caps in USD or tokens, per provider, model, resource, role or key. Hit the cap and the call is blocked.28- **Usage analytics and session logs** roll up cost, tokens and request volume by user, key, model and resource. Session logs - the full prompt and response transcripts - are a Cloud and Enterprise feature, which the personal licence includes.2930For a homelab with half-used credits scattered across several AI vendors, the appeal is obvious: one URL for the agents, one place where the keys live, and an actual answer to the question "where did all that credit go?"3132## The provider list3334Sidebar, **AI Gateway**, **Providers**, **Create**. The typed list is:3536- OpenAI37- Anthropic38- Google Gemini39- Vertex AI40- Amazon Bedrock41- Microsoft Foundry42- OpenRouter43- Vercel AI Gateway44- **Custom**4546No Moonshot. No DeepSeek. My first reaction was mild disappointment. My second was to read what Custom actually does, at which point the disappointment evaporated: both Kimi and DeepSeek expose **OpenAI-compatible APIs**, and anything that speaks a known wire format is one Custom provider away from being on the gateway.4748<p align="center"><img src="/assets/pangolin/ai-gateway-provider-types.jpg" alt="The AI Gateway provider creation form in Pangolin 1.22, defaulting to OpenAI - no Kimi or DeepSeek in the type list" width="800"></p>4950> ## What a Custom Provider Actually Is51>52> A provider is an organisation-level connection to an upstream model API: a type, credentials, a base URL, a set of capabilities declaring which API formats it can handle, and optional model allow and block lists. You create it once, then attach it to any AI Gateway resource in the org.53>54> **Custom** is the type for anything not in the typed list: a self-hosted model server, a vendor API Pangolin doesn't know about, or a downstream router. You pick the capabilities yourself. It also gets one exclusive trick - **Site Targets** routing, which sends requests to the upstream over a Pangolin site tunnel. That's how you put an Ollama box on the home network behind the gateway without exposing it, and it's the bit that makes this unmistakably a Fossorial product rather than yet another AI proxy.5556## Registering Kimi K35758Moonshot's OpenAI-compatible endpoint lives at `https://api.moonshot.ai/v1` and takes a bearer token. That maps straight onto a Custom provider:59601. Sidebar, **AI Gateway**, **Providers**, **Create**.612. **Provider Type**: Custom. Give it a recognisable name - I used "Moonshot Kimi".623. **Capabilities**: select **OpenAI Chat Completions**. That's the format the endpoint speaks, and it's what clients like Codex and OpenCode expect.634. **Routing Mode**: **Upstream URL**, and paste the base URL:6465<pre><code>66https://api.moonshot.ai/v167</code></pre>68695. **Auth Type**: **Bearer**, then paste the Moonshot API key. The key is stored on the provider and never leaves Pangolin.706. **Allow list**: add the exact model ids you intend to call - in my case `kimi-k3`. The allow list is what the gateway advertises and accepts, so be exact.717. Save, then attach the provider to an AI Gateway resource.7273One small gotcha: the typed OpenAI provider's own default URL is `https://api.openai.com/v1`, so the `/v1` suffix on Moonshot's address is the convention, not a typo. If you copy a base URL out of vendor docs and calls start 404ing, a missing or doubled `/v1` is the first thing to check.7475## Registering DeepSeek7677DeepSeek is the same exercise - OpenAI-compatible API, bearer auth:78791. **Providers**, **Create**, **Custom**. Name: "DeepSeek".802. **Capabilities**: **OpenAI Chat Completions**.813. **Routing**: Upstream URL:8283<pre><code>84https://api.deepseek.com/v185</code></pre>86874. **Auth**: Bearer, plus your DeepSeek key.885. **Allow list**: the model ids you plan to call - `deepseek-v4-pro` at the time of writing, but check the DeepSeek docs because their model naming has moved quickly this year.896. Save and attach.9091Ten minutes after discovering the buttons were missing, both vendors were on the gateway.9293## The Claude Code wrinkle: Kimi also speaks Anthropic9495This is the part I found genuinely interesting. Moonshot also runs an **Anthropic-compatible** endpoint at `https://api.moonshot.ai/anthropic`, documented for driving Claude Code with Kimi. Pangolin's own docs use Kimi as their worked Custom provider example for exactly this reason.9697So a second Custom provider gives you Kimi-as-Anthropic:98991. Create another **Custom** provider - "Kimi Anthropic".1002. **Capabilities**: **Anthropic Messages** and **Anthropic Models**.1013. **Routing**: Upstream URL `https://api.moonshot.ai/anthropic`.1024. **Auth Type**: **`x-api-key`** with the Moonshot key - the Anthropic convention, not Bearer.1035. Allow `kimi-k3`, save, attach.104105Why bother? Because the gateway accepts whichever formats its attached providers advertise, and Claude Code speaks Anthropic Messages. Point Claude Code at the gateway resource and it can be talking to Kimi K3 on the other side without knowing or caring:106107<pre><code>108{109 "apiKeyHelper": "echo 'pangolin-key-....'",110 "env": {111 "ANTHROPIC_BASE_URL": "https://ai-gateway.yourdomain.com"112 }113}114</code></pre>115116The Pangolin CLI will write that config for you - `pangolin configure claude` or `pangolin configure codex` - which beats hand-editing settings files.117118## Public or private?119120Two flavours of gateway resource, and you can run both at once:121122- **Public**: the resource gets a real FQDN. Clients call it from anywhere with a **virtual API key** - every org user already has an identity key, and you can mint manual keys for services and shared agents. Pangolin attributes every call to a user or a named key.123- **Private**: reachable only on devices connected with the Pangolin client. Nothing is published to the internet, and authentication is keyless - the connected client is the credential. For agents that refuse to start without something in the key field, the docs suggest the literal string `none`.124125For my setup the private resource is the interesting one. My machines already run the client, so there is no new secret to manage at all.126127## What the end user sees128129That was the question I set out to answer, and the honest answer is: not much changes, which is rather the point. The agent gets a base URL and a key (or a tunnel session) and behaves exactly as it did before. The difference shows up in the dashboard - per-user and per-key spend, token volumes, and on Enterprise the full session transcripts of what the agents actually asked and got back.130131If you've ever opened a vendor console to discover a coding agent ate a surprising amount of credit overnight, the budgets alone justify the exercise. A cap on the DeepSeek provider means the next runaway session gets a 429 instead of an invoice.132133## First impressions134135It's an early iteration of the feature and it shows in places - the typed provider list will clearly grow, and I'd expect Moonshot and DeepSeek to arrive as one-click options eventually given where the coding-agent market is heading. But the Custom provider path is not a second-class workaround. It's the same machinery the first-party types use, with the knobs exposed. If a vendor speaks OpenAI Chat Completions - and in 2026, nearly everyone does - the missing button costs you about five minutes.136137Next on the list: an Ollama box on the home network via Site Targets, so the gateway fronts local models and cloud credits through the same URL. I also want a week of Bob's traffic in the session logs, partly for the analytics and partly to see what I actually ask him. More once I've broken something.138139---140141**Related:**142143- 🦎 [Pangolin 1.22 release notes](https://pangolin.net/news/1-22-release) - the AI Gateway announcement144- 📖 [Pangolin docs: Custom providers](https://docs.pangolin.net/manage/ai/providers/custom) - capabilities, routing and auth reference145- 🔐 [The Open Source Path from VPN Sprawl to Zero Trust Access](/post/pangolin-zero-trust-production-evaluation) - my original Pangolin evaluation146- 🤖 [Bob Got an Update: Kimi K3 and the AI Sputnik Moment](/post/bob-got-an-update-kimi-k3) - why there's Moonshot credit in this house147