Skip to main content

Provider Manifests

This convention originally applied to every provider onboarded via Tier 2, 3, or 4: one JSON file here, named <provider>.json where <provider> is the exact AIProviderName enum value (e.g. cerebras.json for AIProviderName.CEREBRAS = "cerebras").

Tier 2 (JSON catalog) providers no longer use a manifest here​

As of the provider-JSON-catalog refactor, Tier 2 providers are declared entirely in src/lib/providers/catalog/<id>.json, validated by the zod schema in src/lib/providers/catalog/schema.ts. That file's evidence object — rosterVerified, addedInPR, and optionally authProbe, billingProbe, liveMatrix — carries the same onboarding evidence a manifest used to hold, so a separate manifest file would just duplicate it. tools/verify-provider-onboarding.ts reflects this: for any provider with a matching src/lib/providers/catalog/<id>.json file, the gate checks that the JSON file exists, parses via the real zod schema, and (via that same successful parse, since both fields are non-optional in the schema) carries evidence.rosterVerified and evidence.addedInPR.

cerebras.json and sambanova.json — the two manifests that used to live in this directory — were removed for this reason: both providers are now JSON-catalog entries, and their onboarding evidence lives in src/lib/providers/catalog/cerebras.json and src/lib/providers/catalog/sambanova.json respectively.

Tier 3/4 (hand-written) providers still use a manifest here​

A provider onboarded outside the JSON catalog — a custom adapter (Tier 3) or fully custom integration (Tier 4) — has no catalog JSON file, so tools/verify-provider-onboarding.ts falls back to its original four-check flow for it, including a manifest at docs/provider-integration/manifests/<name>.json. The shape below still applies to those providers.

The block is annotated JSONC for documentation purposes only — the // comments and trailing comma explain each field but are not valid JSON. A real <provider>.json manifest file must be strict JSON: no comments, no trailing commas.

{
// Must exactly equal the AIProviderName enum value.
"provider": "example-vendor",

// 3 or 4. (Tier 1 never gets a manifest; Tier 2 uses catalog evidence
// instead — see above.)
"tier": 3,

// Full PR URL. Leave "" until the PR exists, fill in before merge. Must
// be a string; the gate does not check that it is a URL.
"addedInPR": "https://github.com/juspay/neurolink/pull/1234",

// YYYY-MM-DD.
"addedDate": "2026-08-15",

// Every file this provider's onboarding touched — used for PR review,
// not machine-checked beyond "an array of strings".
"filesTouched": ["src/lib/constants/enums.ts", "..."],

// Must match the section-name prefix used in
// test/continuous-test-suite-providers-mocked.ts's `record(results,
// `${section}: ...`, ...)` calls for this provider, e.g. "LLM cerebras".
"mockedContractSection": "LLM example-vendor",

// One of: "not-tested" | "manual-live-tested" | "ci-mocked-only" |
// "verified-live". The gate requires a string, not one of these values.
"manualTestStatus": "not-tested",

// REQUIRED when tier === 4 only. A sentence or two justifying why
// this couldn't be Tier 2/3. See ../tiers/tier-4-full-custom.md.
"tier4Justification": "...",
}

How it's checked​

pnpm run verify:provider-onboarding (tools/verify-provider-onboarding.ts) fails a PR that introduces a new AIProviderName member without matching onboarding evidence: a valid catalog JSON entry for Tier 2 providers (see above), or a structurally valid manifest here for Tier 3/4 providers. A manifest is structurally valid when it is a JSON object whose provider matches the file name and which carries provider, tier, addedInPR, addedDate, filesTouched (an array of strings), mockedContractSection and manualTestStatus, plus tier4Justification when tier is 4. The gate does not retroactively require either for providers that predate the gate — see that tool's LEGACY_PROVIDERS list.