Skip to main content
CID222 Docs

Provider and egress problems

Credentials that will not save, chat requests that fail before the model, rate limits, and an appliance that cannot reach the provider at all.

  • Version: 0.4
  • Role: admin_user
  • Type: troubleshooting

Everything between "the key is correct" and a completion streaming back. Find the symptom in the table, then work the runbook under it.

Four different things fail in ways that look identical from the chat window: the catalogue has no model, no credential resolves, the credential is refused by the provider, and the provider is never reached at all. The runbooks below separate them in that order, because each one is cheaper to check than the next.

Find your symptom

What you seeRunbook
The provider or model list is emptyNo providers are in the catalogue
A credential will not save, or its test failsA credential is rejected
Chat fails instantly, naming a provider, model or credentialA chat request fails before the model
Everything times out, and the network team says the network is openThe appliance cannot get out
Requests are refused as too frequent, or a quota is exhaustedRate limits and quotas
An API client gets 401 with a cid_key_ tokenA gateway API key is refused

The catalogue

No providers are in the catalogue

Providers and models are seeded data, not code. With no rows, no model id resolves and every completion fails at the first lookup — before any credential or network path is involved.

Runbookproviders

No LLM providers are in the catalogue, so every completion fails

You might see: No LLM providers are in the catalogue · chat cannot resolve a model · the model dropdown is empty · every completion fails with a model error

Before you start

Checks

  1. 1

    Verify the gateway can reach the database, since the catalogue is read from it rather than hard-coded

    diagnostics · datastores.postgres.reachable = true

  2. 2

    Verify no migrations are pending, so the provider and model tables have their current shape

    diagnostics · datastores.postgres.migrationsPending

  3. 3

    Ask the gateway for the model catalogue

    GET /models

Credentials

A credential is rejected

Three refusals share this screen and have nothing else in common: the endpoint validator refuses a URL it will not store, the assignment rule refuses a credential attached to both a tenant and a group, and the provider refuses the key itself. Only the third is about the key.

Note

Provider keys are stored as v1:-prefixed AES-256-GCM ciphertext and are never readable back through the dashboard. Retyping the key is the only way to confirm what is stored. Values written before the transformer existed pass through unchanged, so a legacy row on an old deployment can still be plaintext.

Runbookproviders

A provider credential will not save, or its test fails

You might see: Invalid Anthropic API key · Test failed to run · Failed to create credential · Failed to update credential

Before you start

Checks

  1. 1

    For a credential that carries an endpoint (Azure OpenAI, or any self-hosted endpoint), read the exact rejection text

    expected · The endpoint is an absolute http(s) URL that does not resolve into link-local space.

  2. 2

    Check what the credential is assigned to

    expected · Exactly one of them is set.

  3. 3

    Check whether the appliance can reach the provider at all before blaming the key

    diagnostics · appliance.egress

  4. 4

    Read what the credential test actually reported

    expected · The test succeeds.

A chat request fails before the model

The gateway resolves the model row, then a credential, then calls the provider. A failure at each step reads the same to the user and needs a different fix — and an inactive model breaks every client still naming it, including clients that worked yesterday.

Runbookchat

A chat request fails before the model is reached

You might see: Provider 'openai' not found · Model 'gpt-4o' not found · Model 'gpt-4o' is not active · Model not found for provider

Before you start

Checks

  1. 1

    Check that the provider and model catalogue is populated at all

    expected · Providers and models are listed.

  2. 2

    Read whether the model the caller named exists and is active

    expected · The model is listed and active.

  3. 3

    Check that a credential resolves for this caller and provider

    expected · One active credential resolves.

  4. 4

    Test the credential that resolves

    expected · The test succeeds.

Egress

The appliance cannot get out

Name resolution, a TCP connection on 443, and an authenticated request through the site proxy fail independently. A key that is never delivered fails exactly like a wrong key, which is why the egress check belongs before the credential check whenever nothing at all is working.

Runbookinstall

The appliance cannot get out — one or more egress tests failed

You might see: egress tests failed · the appliance cannot reach the registry · ETIMEDOUT after 5000ms · proxy returned 407 Proxy Authentication Required

Before you start

Checks

  1. 1

    Verify the appliance actually ran its outbound probes

    diagnostics · appliance.egress

  2. 2

    Read the name-resolution results for the hosts this appliance must reach

    diagnostics · appliance.dns

  3. 3

    Read whether an outbound proxy is configured on the appliance

    diagnostics · appliance.proxy.configured = true

  4. 4

    Read whether the release channel answered on the last attempt

    diagnostics · appliance.update.channelReachable = true

  5. 5

    Check whether a TLS-inspection device is presenting its own certificate to the appliance

    expected · The issuer is a public certificate authority, not your organisation's inspection CA.

Note

A TLS-inspecting middlebox produces a TLS error, not a timeout. Read each failing target's detail line in the diagnostic snapshot before changing a firewall rule: a 407 is a proxy credential problem, a timeout is a blocked path, and a handshake error is inspection.

Limits

Rate limits and quotas

A gateway throttle, an API-key quota and the provider's own 429 look alike to the caller and have completely different remedies. Only the first two are settings on this appliance.

Runbookproviders

A request is refused for being too frequent, or a quota is exhausted

You might see: Too many requests, please try again later. · Too many help requests, please try again in a few minutes. · Too many unlock requests, please try again later. · Too many attestation requests

Checks

  1. 1

    Establish which limit refused the call — the gateway's own throttle, an API-key quota, or the provider's

    expected · You can say which of the three it is.

  2. 2

    For a quota message, read the key's configured request and token quotas

    expected · The key has headroom left in the current window.

  3. 3

    Check that Redis is reachable, because the throttles keep their counters there

    diagnostics · datastores.redis.reachable = true

A gateway API key is refused

Keys are hashed, so a lost key cannot be recovered — only replaced. The interesting case is a group key: it borrows the identity of the group's earliest-added member, so emptying the group stops the key resolving and removing that member transfers the key's identity rather than revoking it.

Runbookaccess

A gateway API key is refused

You might see: Invalid API key · Invalid or expired API key · API key is not active · API key has expired

Before you start

Checks

  1. 1

    Find the key in the estate

    expected · The key exists.

  2. 2

    Read the key's status and expiry

    expected · The key is active and either has no expiry or expires in the future.

  3. 3

    Check what identity the key resolves to

    expected · The key is assigned to a tenant, or to a group that has at least one member.

Last updated on

On this page

Download PDF