Skip to main content
Version: 1.11.x

Manifest reference

This page is the reference for the extension.json manifest used by manifest-shipping extensions, including curated packages and graduated standalone packages.

The lfx-bundles metapackage uses manifest-less discovery through the lfx.bundles group and does not use extension.json.

The canonical JSON Schema lives at https://schemas.langflow.org/extension/v1.json and is generated from the Pydantic model at lfx.extension.manifest.ExtensionManifest.

To export the live schema, run:

lfx extension schema --output extension.schema.json

Use the $schema reference in your manifest so editors can autocomplete and validate inline:

{
"$schema": "https://schemas.langflow.org/extension/v1.json",
"id": "lfx-my-extension",
"version": "0.1.0",
"name": "My extension",
"lfx": { "compat": ["1"] },
"bundles": [{ "name": "my_bundle", "path": "components/my_bundle" }]
}

Top-level fields​

FieldTypeRequiredDescription
idstringyesGlobally-unique extension ID. Lowercase, hyphenated, starts with a letter, 2-64 chars. Convention: lfx-<name>.
versionstringyesSemVer 2.0.0 version string for this extension release.
namestringyesHuman-readable display name shown in the Langflow palette. 1-200 chars.
descriptionstring | nullnoOptional one-paragraph summary, max 2000 chars.
lfxobjectyesCompatibility declaration against the BUNDLE_API contract.
bundlesarrayyesBundle list. v0 accepts exactly one bundle.
capabilitiesobjectnoOptional capability flags. Defaults to all-false.
$schemastringnoOptional pointer to this JSON Schema; editors use it for autocomplete.

additionalProperties: false — any field not listed here is rejected with a typed error. Reserved names (services, routes, hooks, starterProjects, userConfig) are documented under Deferred fields and surface a more specific error code.

lfx: compatibility declaration​

"lfx": { "compat": ["1"] }
FieldTypeDescription
compatarray of stringsNon-empty list of BUNDLE_​API.md contract versions this extension supports. Each entry is a positive-integer string.

The runtime compares str(BUNDLE_API_VERSION) against this list. A mismatch fails install with version-constraint-unsatisfied. v0 accepts only "1"; lists like ["1", "2"] become meaningful when a future BUNDLE_API revision ships.

bundles​

"bundles": [
{ "name": "my_bundle", "path": "components/my_bundle" }
]
FieldTypeDescription
namestringBundle name; addressable as ext:<bundle>:<Class>@<slot>. Lowercase snake_case, starts with a letter, 2-64 chars.
pathstringPath to the bundle directory, relative to the manifest. Must not start with / or contain ...

v0 enforces minItems: 1, maxItems: 1; multi-bundle extensions are rejected with multi-bundle-deferred-in-this-milestone and ship in a later epic.

capabilities​

Optional. Defaults to { "requiresCredentials": false }.

FieldTypeDescription
requiresCredentialsboolIf true, the loader records that components in this bundle expect credential variables to be configured before use.

Additional capability keys are rejected with extra="forbid" so a misspelled key surfaces immediately rather than silently turning a feature off.

Deferred fields​

The schema strips these names from the published properties map but reserves them via x-deferred-fields, so a manifest that sets one gets a specific error code instead of the generic "additional property" message.

Reserved keyReplacement error codeFuture epic
servicesfield-deferred-in-this-milestoneB2 — non-component primitives
routesfield-deferred-in-this-milestoneB2 — non-component primitives
hooksfield-deferred-in-this-milestoneB2 — non-component primitives
starterProjectsfield-deferred-in-this-milestonelater milestone
userConfigfield-deferred-in-this-milestonelater milestone

A manifest that sets any of these to a non-null value is rejected at validate / load time. Setting them to null is allowed (the loader treats null and absent identically).

Pyproject alternative​

If you'd rather not ship a separate extension.json next to pyproject.toml, declare the same fields under [tool.langflow.extension]:

[tool.langflow.extension]
id = "lfx-my-extension"
version = "0.1.0"
name = "My extension"

[tool.langflow.extension.lfx]
compat = ["1"]

[[tool.langflow.extension.bundles]]
name = "my_bundle"
path = "components/my_bundle"

The loader prefers an extension.json when both exist. The Pydantic validator is the same so error codes and field semantics are identical.

Error codes raised against this manifest​

The loader and validator both emit typed errors keyed by the manifest field that triggered them. The full reference is on the Extension error codes page; the codes most relevant when authoring a manifest are:

CodeCause
manifest-invalidSchema validation failed; the message names the field.
manifest-not-foundNo extension.json and no [tool.langflow.extension] section at the extension root.
version-constraint-unsatisfiedlfx.compat does not include this Langflow's BUNDLE_​API_​VERSION.
field-deferred-in-this-milestoneA reserved field was set to a non-null value.
multi-bundle-deferred-in-this-milestonebundles has more than one entry.
path-escapeA bundles[].path resolves outside the manifest root (typically a symlink).
bundle-path-not-foundbundles[].path does not exist or is not a directory.

Run lfx extension validate <path> to see every error as a structured object with code, message, location, hint, and ref_url.

See also​

Was this page helpful?

Support
Search