client.providers
client.providers — the providers operations.
On AsyncKindgi every method is the same, awaited.
client.providers.list()
Section titled “client.providers.list()”list( *, limit: int | None = None, cursor: str | None = None, feature: str | None = None, timeout: float | None = None,) -> ProviderCollectionPageList model providers. GET /v1/providers
Cursor-paginated. Optional ?feature= filters to providers whose metadata.features includes the given feature (exact match).
client.providers.register()
Section titled “client.providers.register()”register( body: RegisterProviderBody | Mapping[str, Any] | None = None, /, *, idempotency_key: str | None = None, timeout: float | None = None, **fields: Any,) -> RegisterProviderResultRegister a model provider. POST /v1/providers
Body is a full ProviderMetadata. Server validates shape: provider-level id + region non-empty; models[] non-empty with unique name per entry; per-model contextWindow positive integer; per-model features against the closed enum; per-model cost non-negative; optional per-model p95LatencyMs / maxOutputTokens well-shaped; optional labels within their limits — same rules as @kindgi/capabilities.createProviderRegistry. Secrets (API keys, endpoints) are NOT part of the wire shape; deployments store them inside the binding. When the runtime has the adapter the body names, that adapter checks the registration first (its adapter_config, the metadata and the presence of secret_ref; static: no network, no secret read): a problem refuses it with 422 provider-config-invalid. A model provider's key is used by its provider only: a secret_ref naming a secret that a tool, an MCP endpoint or a webhook endpoint already uses is refused (409 provider-key-in-use), and from then on the name is refused to tools and endpoints.
client.providers.get()
Section titled “client.providers.get()”get(provider_id: str | UUID, /, *, timeout: float | None = None) -> ProviderMetadataFetch a provider. GET /v1/providers/{providerId}
Returns the wire-safe ProviderMetadata (routing metadata only — secrets never cross the wire).
client.providers.capabilities()
Section titled “client.providers.capabilities()”capabilities( provider_id: str | UUID, /, *, timeout: float | None = None,) -> ProviderCapabilitiesResultList capabilities a provider satisfies. GET /v1/providers/{providerId}/capabilities
Sub-resource: returns the catalog capability descriptors the provider fulfils. Empty array = known provider with no matches; 404 = unknown provider.
client.providers.check()
Section titled “client.providers.check()”check( provider_id: str | UUID, /, *, timeout: float | None = None,) -> ProviderCheckResultCheck a provider's registration. GET /v1/providers/{providerId}/check
Runs the provider's adapter check over its stored registration (its adapter_config, its metadata, whether it names a secret_ref): the check POST /v1/providers runs before it stores one. Static: no network call, no secret read. issues lists what would keep the runtime from building the provider, each with a JSON-pointer path; an adapter this runtime doesn't have is one (/adapter_id). warnings lists the adapter_config keys its adapter doesn't take: the runtime builds it without reading them. checked is false when this runtime has no check for the provider's adapter and the adapter declares no keys.
client.providers.unregister()
Section titled “client.providers.unregister()”unregister( provider_id: str | UUID, /, *, idempotency_key: str | None = None, timeout: float | None = None,) -> UnregisterProviderResultUnregister a model provider. POST /v1/providers/{providerId}/unregister
A tombstone, not an erase: from then on the provider is gone from list, get and capabilities, and the router never picks it. Its id is free to register again. A retention policy on the provider domain purges the row.