Register a model provider
const url = 'https://example.com/v1/providers';const options = { method: 'POST', headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'}, body: '{"metadata":{"id":"example","region":"example","models":[{"name":"example","contextWindow":1,"features":["structured-output"],"cost":{"promptUsdPer1kTokens":1,"completionUsdPer1kTokens":1},"p95LatencyMs":1,"maxOutputTokens":1,"description":"example"}],"attributes":["example"],"description":"example","capabilityKind":"example","fallback":true},"adapter_id":"example","secret_ref":{"envName":"example","name":"example"},"adapter_config":{"additionalProperty":"example"}}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url https://example.com/v1/providers \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "metadata": { "id": "example", "region": "example", "models": [ { "name": "example", "contextWindow": 1, "features": [ "structured-output" ], "cost": { "promptUsdPer1kTokens": 1, "completionUsdPer1kTokens": 1 }, "p95LatencyMs": 1, "maxOutputTokens": 1, "description": "example" } ], "attributes": [ "example" ], "description": "example", "capabilityKind": "example", "fallback": true }, "adapter_id": "example", "secret_ref": { "envName": "example", "name": "example" }, "adapter_config": { "additionalProperty": "example" } }'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 — same rules as @kindgi/capabilities.createProviderRegistry. Secrets (API keys, endpoints) are NOT part of the wire shape; deployments store them inside the binding.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Header Parameters
Section titled “Header Parameters”Caller-supplied idempotency key. Retries with the same key return the original response byte-identical (per docs/API-ROUTE-CONVENTIONS.md §3.1).
Request Bodyrequired
Section titled “Request Bodyrequired”object
object
Region the connection routes to. All models on this provider share the region (the same models served from two clouds or regions are separate providers). 'unspecified' when not region-scoped.
Models this connection exposes. Non-empty. models[i].name must be unique within the list.
object
Vendor-facing model id passed to the SDK (e.g. claude-sonnet-4-6).
Context window in tokens.
Features this model supports (tool-use, thinking, structured-output, …).
USD per 1K tokens. An adapter may take more rate fields (see the adapter’s README).
object
Best-effort p95 latency estimate in milliseconds. Varies by model.
Fallback cap on output tokens. Adapters that require max_tokens on every request (e.g. Anthropic) use this when ModelCallInput.maxOutputTokens is unset.
Short per-model description surfaced in logs.
Soft attributes for preference-ranking (local, lower-cost, higher-accuracy, …). Matched by string equality against Preference.feature.
Short human description of the connection.
Kind of resource this provider fulfils. Absent = llm-inference. Adapters for other kinds (embedding, gpu-compute, sandbox-exec, …) set this explicitly.
A fallback serves a capability only when no other provider satisfies it (e.g. kindgi dev’s scripted dev-echo); an agent turn routed to one carries a fallback-provider warning. Absent = false.
The adapter that instantiates this provider (e.g. @kindgi/adapter-model-gemini). Must be registered for the tenant.
The tenant secret holding the adapter’s credential (an API key, a service-account key). Absent when the adapter needs none or finds its own (a cloud’s default credentials).
object
Responses
Section titled “Responses”Provider registered.
object
Examplegenerated
{ "providerId": "example"}Validation failed (see details.reason).
object
object
Stable machine-readable discriminant. Values match domain error codes (see docs/API-ROUTE-CONVENTIONS.md §4.3).
Optional, kind-specific.
object
Server-assigned request id; also echoed via X-Request-Id header.
Examplegenerated
{ "error": { "code": "example", "message": "example", "details": {}, "requestId": "example" }}Missing / malformed / expired / revoked bearer token.
object
object
Stable machine-readable discriminant. Values match domain error codes (see docs/API-ROUTE-CONVENTIONS.md §4.3).
Optional, kind-specific.
object
Server-assigned request id; also echoed via X-Request-Id header.
Examplegenerated
{ "error": { "code": "example", "message": "example", "details": {}, "requestId": "example" }}Provider already registered at that id.
object
object
Stable machine-readable discriminant. Values match domain error codes (see docs/API-ROUTE-CONVENTIONS.md §4.3).
Optional, kind-specific.
object
Server-assigned request id; also echoed via X-Request-Id header.
Examplegenerated
{ "error": { "code": "example", "message": "example", "details": {}, "requestId": "example" }}Server error (unmapped domain code or framework crash).
object
object
Stable machine-readable discriminant. Values match domain error codes (see docs/API-ROUTE-CONVENTIONS.md §4.3).
Optional, kind-specific.
object
Server-assigned request id; also echoed via X-Request-Id header.
Examplegenerated
{ "error": { "code": "example", "message": "example", "details": {}, "requestId": "example" }}